Как я могу написать регулярное выражение, которое совпадает со словами, которые перекрывают друг друга? - PullRequest
0 голосов
/ 06 июня 2011

Я пытаюсь сопоставить слово вперед и назад в строке, но оно не перехватывает все совпадения.Например, в поиске слова «AB» в строке «AAABAAABAAA» я создаю и использую регулярное выражение / AB | BA /, но оно соответствует только двум подстрокам «AB» и игнорирует подстроки «BA».*

Я использую RegexKitLite на iPhone, но я думаю, что это более общая проблема регулярных выражений (я вижу такое же поведение в онлайн-тестерах регулярных выражений).Тем не менее, вот код, который я использую для перечисления совпадений:

[@"AAABAAABAAA" enumerateStringsMatchedByRegex:@"AB|BA" usingBlock:
 ^(NSInteger captureCount,
   NSString * const capturedStrings[captureCount],
   const NSRange capturedRanges[captureCount],
   volatile BOOL * const stop) { 
     NSLog(@"%@", capturedStrings[0]);
 }];

Вывод:

AB
AB

Ответы [ 3 ]

1 голос
/ 06 июня 2011

Я не знаю, какой онлайн-тестер вы пробовали, но http://www.regextester.com/ (например) не будет рассматривать один и тот же символ для нескольких совпадений. В этом случае, поскольку ABA соответствует AB, B не рассматривается для соответствия BA. Это всего лишь предположение, что RegexKitLite реализован аналогично.

Даже если вы не рассматриваете зеркальный вариант, исходная строка поиска может совпадать с самой собой. Например, если вы будете искать ABCA | ACBA в ABCABCACBACBA, вы получите два из четырех совпадений, поиск в обоих направлениях будет одинаковым.

Должно быть возможно найти совпадения постепенно, но, возможно, не с RegexKitLite

1 голос
/ 06 июня 2011

Я бы сказал, это невозможно за один ход.Регулярное выражение соответствует заданному шаблону и «съедает» соответствующие символы.Поэтому, если вы ищете AB|BA в ABA, первый найденный шаблон - AB, тогда регулярное выражение продолжит поиск на третьем A.

. Таким образом, невозможно найти перекрывающиеся шаблоны сто же самое регулярное выражение и использование оператора |.

0 голосов
/ 06 июня 2011

Я не уверен, как бы вы выполнили в точности то, что, как мне кажется, вы просите, не переставляя строку и не проверяя дважды.

Однако, я полагаю, это зависит от того, что именно вы ищете. Если вы просто пытаетесь определить , если шаблон встречается в строке вперед или назад, а не как , то вы можете сделать что-то вроде этого:

ABA?|BAB?

? делает последний символ необязательным с каждой стороны |. В случае AAABAAABAAA он найдет ABA дважды. В случае AB он найдет AB, а в случае BA он найдет BA.

Вот это с тестовыми примерами ... http://regexhero.net/tester/?id=a387ae0a-1707-4d9e-856b-ebe2176679bb

...