Регулярное выражение с использованием режима Dot-Matches-All - PullRequest
2 голосов
/ 03 декабря 2010

Обычно . не соответствует символу новой строки, если я не укажу движок для этого с флагом (? S ).Я попробовал это регулярное выражение на движке моего редактора (UltraEdit v14.10), используя режим регулярного выражения в стиле Perl:

(?s).*i

Текст поиска содержит несколько строк, и каждая строка содержит много символов «i».

Я ожидаю, что приведенное выше регулярное выражение означает: ищите как можно больше символов (потому что с ? S '. теперь соответствует чему угодно, включая перевод строки)жадность *) до достижения символа «я».

Это должно означать «от первого символа до последнего« i »в последнем предложении» (жадность должна доходить до последнего предложения, верно?).

Нос помощью теста UltraEdit получается «от первого символа до последнего« i »в первом предложении, которое содержит i».Это правильный результат?Неужели я неправильно интерпретировал выражение reg?

, например, учитывая, что этот текст

aaa
bbb
aiaiaiaiaa  
bbbicicid

соответствует

aaa
bbb
aiaiaiai

.Но я ожидаю:

aaa
bbb
aiaiaiaiaa  
bbbicici

Ответы [ 3 ]

5 голосов
/ 03 декабря 2010

Ваше регулярное выражение верно, как и ваши ожидания относительно его производительности.

Это давно известная ошибка в реализации регулярного выражения UltraEdit, о которой я неоднократно писал, чтобы поддержать.Насколько я знаю, это все еще не было исправлено.Проблема, по-видимому, заключается в том, что реализация регулярных выражений в UE по существу основана на строках, и дополнительные строки включаются в совпадение только при необходимости.Таким образом, .* будет жадно совпадать с текущей строкой, но не будет пересекать границу новой строки, если это не требуется для достижения соответствия.

Существуют некоторые другие тонкие ошибки с окончаниями строки.Например, lookbehind не работает через переводы строк.

Запись в поддержку IDM или переход в редактор с приличной поддержкой регулярных выражений.Я сделал оба.

1 голос
/ 03 декабря 2010

Вы правы, что это регулярное выражение должно соответствовать всей строке (все 4 строки). Я предполагаю, что UltraEdit пытается выполнить какую-то оптимизацию, работая построчно, и накапливает новые строки только «при необходимости».

1 голос
/ 03 декабря 2010

Да, вы правы, это похоже на ошибку.

Ваша интерпретация верна. Если вы находитесь в режиме Perl, а не в Posix. Однако это должно относиться и к posix.

Хотя определение модификаторов, как вы делаете, очень редко.

В основном вы предоставляете строку с разделителями и модификаторы, такие как /.*i/s

Но это не имеет значения, потому что ваш путь тоже правильный. И если он не будет поддерживаться, он также не будет совпадать с первой новой строкой.

Так что да, это определенно ошибка в вашей программе.

...