2009-05-15 7 views
0

Si une langue se compose d'ensemble {un, b, c} seulement comment pouvons-nous construire une expression régulière pour le langage dans lequel aucun deux caractères consécutifs apparaissent.expression régulière pour les caractères non consécutifs

par exemple: abcbcabc seront valables et aabbcc sera rejetée par l'expression régulière.

+1

devoirs va bien? – Benjol

Répondre

1

En supposant "()" est une notation de groupement, et "a|b" représente alogique oub, puis, dans pseudocode

if regexp('/(aa)|(bb)|(cc)/', string) == MATCH_FOUND 
    fail; 
else 
    succeed; 

n'a probablement pas besoin du groupement, Gumbo dit. Je les ai là juste pour être sûr et clair.

+1

Vous n'avez pas besoin du groupement. – Gumbo

1

Vous devez correspondre à l'entrée contre quelque chose comme ça (codifiées dans tout ce que vous voulez), et si vous avez trouvé une coïncidence alors il est la langue que vous voulez:

[^{aa}|{bb}|{cc}] 
4

correspond à cette expression abcbcabc mais pas aabbcc

// (?:(\w)(?!\1))+ 
// 
// Match the regular expression below «(?:(\w)(?!\1))+» 
// Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» 
// Match the regular expression below and capture its match into backreference number 1 «(\w)» 
//  Match a single character that is a “word character” (letters, digits, etc.) «\w» 
// Assert that it is impossible to match the regex below starting at this position (negative lookahead) «(?!\1)» 
//  Match the same text as most recently matched by capturing group number 1 «\1» 

Modifier

comme cela a été expliqué dans les commentaires, les limites de chaîne font matière. La regex devient alors

\m(?:(\w)(?!\1))+\M 

Félicitations à Gumbo.

+2

Ne pas oublier les limites de la chaîne. – Gumbo

+0

@Gumbo, +1 pour me le rappeler mais je doute que ce soit nécessaire. Ce qui serait passé à la vérification est l'ensemble, jamais un bloc entier de texte. –

+1

Si vous ne marquez pas le début de la fin de la chaîne, 'abb' sera également apparié. – Gumbo

2

Ne pouvons-nous pas rester simple? Juste 'sinon' ce regex:

/(aa|bb|cc)/ 
Questions connexes