2010-12-03 4 views
2

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

(?s).*i 

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

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

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

Но с тестом UltraEdit он оказывается «от первого символа до последнего« i »в первом предложении, содержащем i». Правильно ли этот результат? Я сделал неправильную интерпретацию моего рег-выражения?

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

aaa 
bbb 
aiaiaiaiaa 
bbbicicid 

это

aaa 
bbb 
aiaiaiai 

совпадают. Но я ожидаю:

aaa 
bbb 
aiaiaiaiaa 
bbbicici 

ответ

5

Ваше регулярное выражение соответствует вашим ожиданиям.

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

Есть несколько других тонких ошибок с концами строк. Например, lookbehind также не работает в новых символах.

Напишите в службу поддержки IDM или замените редактор на подходящую поддержку регулярных выражений. Я сделал оба.

+0

Я не знаю об ошибке, которую вы упомянули. Но может ли быть так, что жадный поиск по всему входному файлу слишком медленный, что они решили изменить поведение таким образом? Помните, UltraEdit позволяет редактировать входной файл MB в размере. – JavaMan 2010-12-03 19:03:01

+0

EditPadPro обрабатывает файлы GB в размерах и не имеет этих ограничений регулярного выражения. Если я создаю жадное регулярное выражение, я ожидаю, что он будет работать правильно. Если это означает нехватка памяти, то это моя проблема или ОС, но редактор не должен меня догадываться. – 2010-12-03 19:05:55

1

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

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

Вышеуказанные модификаторы, как и вы, очень редки.

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

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

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

1

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