2015-08-01 4 views
0

Я хочу захватить слова, которые не имеют одинаковых букв рядом друг с другом. Это находит письмо, а затем проверяет, не является ли другое письмо рядом с ним. Это работает.Почему эти два выражения не равны?

\b((\w)(?!(\2)))+\b 

Это один говорит, не совпадают слова, которые имеют одни и те же буквы рядом друг с другом, по крайней мере, это то, что я думаю, что он должен делать, но он не работает.

\b(?!((\w)\3))+\b 
+3

** FYI **, второй ссылается на несуществующий подшаблоном (в данном случае '\ 3', это будет' \ 2' ..) и используя Коэффициент '+' вне внешнего вида не поддается количественной оценке. – hwnd

+1

Посмотрите вперед, используя '(?! ...)' does * not * создайте группу захвата, поэтому у вас есть только две группы захвата во втором выражении, что делает '\ 3' недействительным. – poke

+0

@hwnd Что значит несуществующий подшаблон? –

ответ

0

Вторая модель \b(?!((\w)\3))+\b очень странно

  • Там нет \3, так как негативный взгляд вперед (?!...) не образует захвата группы, так что у вас есть только две группы

  • Если общий шаблон соответствует, то вы знаете отрицательный прогноз вперед не имеет, так что \1 и \2 будет не версия определяется

  • Вы просите нескольких копий нулевой ширины рисунка (отрицательный взгляд вперед соответствует одной точки в строке)

  • Отрицательный взгляд вперед никогда не будет потреблять любой символов, так что не может быть никаких символов между двумя границами слова

это трудно понять, как «исправить» это для вас, как я не могу увидеть алгоритм, который вы пытались реализовать. Сначала вам не нужны круглые скобки вокруг \2: просто (?!\2) в порядке, и вы не фиксируете целое слово для использования после матча, что обычно лучше, чем использование всей строки со строкой

Я думаю, что я бы написать этот

\b((?:(\w)(?!\2))+)\b 
Смежные вопросы