регулярное выражение для непоследовательных символов - PullRequest
0 голосов
/ 15 мая 2009

Если язык состоит из множества { a , b , c } только как мы можем построить регулярное выражение для языка, в котором нет двух последовательных появляются символы.

Например: abcbcabc будет действительным, а aabbcc будет отклонено регулярным выражением.

Ответы [ 4 ]

4 голосов
/ 15 мая 2009

Это регулярное выражение соответствует abcbcabc , но не 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»

Редактировать

как было объяснено в комментариях, границы строк do имеют значение. Регулярное выражение затем становится

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

Слава Гамбо.

2 голосов
/ 15 мая 2009

Разве мы не можем просто сделать это простым? Просто «если нет» это регулярное выражение:

/(aa|bb|cc)/
1 голос
/ 15 мая 2009

Вы должны сопоставить входные данные с чем-то вроде этого (закодированным на том, что вы хотите), и если вы нашли совпадение, то это язык, который вы хотите:

[^{aa}|{bb}|{cc}]
1 голос
/ 15 мая 2009

Предполагая, что "()" является обозначением группировки, а "a|b" означает a логический или b, то в псевдокоде

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

Возможно, группировка не нужна, как сказал Гамбо . У меня они там, чтобы быть в безопасности и ясности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...