Регулярное выражение для совпадения с точной строкой (не разрешать завершать символ новой строки)

В.NET System.Text.RegularExpressions.Regex, если ^ а также $ добавлены в регулярное выражение для поиска точных совпадений, он по-прежнему возвращает истину для IsMatch, если завершается \n добавляется к проверяемой строке.

Например, следующий код:

Regex regexExact = new Regex(@"^abc$");
Console.WriteLine(regexExact.IsMatch("abc"));
Console.WriteLine(regexExact.IsMatch("abcdefg"));
Console.WriteLine(regexExact.IsMatch("abc\n"));
Console.WriteLine(regexExact.IsMatch("abc\n\n"));

возвращает:

true
false
true
false

Что такое регулярное выражение, которое будет возвращать false для всего вышеперечисленного, кроме первого?

1 ответ

Решение

Решение

Вы должны использовать самый конец строки привязки \z:

Regex regexExact = new Regex(@"^abc\z");

См. Якоря в регулярных выражениях:

$ Совпадение должно происходить в конце строки или строки или перед \n в конце строки или строки. Для получения дополнительной информации см. Конец строки или строки.
\Z Соответствие должно происходить в конце строки или перед \n в конце строки. Для получения дополнительной информации см. Конец строки или Перед завершением новой строки.
\z Совпадение должно происходить только в конце строки. Для получения дополнительной информации см. Только конец строки.

Один и тот же якорь можно использовать в .net, java, pcre, delphi, ruby и php. В питоне используйте \Z, В JavaScript RegExp (ECMAScript) совместимые шаблоны, $ якорь соответствует самому концу строки (если нет /m модификатор определен).

Фон

см. Завершение строки с разрывом строки на регулярном выражении:

Поскольку Perl возвращает строку с новой строкой в ​​конце при чтении строки из файла, механизм регулярных выражений Perl соответствует $ в позиции до разрыва строки в конце строки, даже если многострочный режим отключен. Perl также соответствует $ в самом конце строки, независимо от того, является ли этот символ переводом строки. Так ^\d+$ Матчи 123 является ли строка темы 123 или же 123\n,

Большинство современных регулярных выражений скопировали это поведение. Это включает в себя.NET, Java, PCRE, Delphi, PHP и Python. Это поведение не зависит от каких-либо настроек, таких как "многострочный режим".

Во всех этих вариантах, кроме Python, \Z также совпадает до финального разрыва строки. Если вы хотите найти совпадение только в самом конце строки, используйте \z (нижний регистр z вместо верхнего регистра Z). \A\d+\z не совпадает 123\n, \z соответствует после переноса строки, который не соответствует классу сокращенных символов.

В Python \Z соответствует только в самом конце строки. Python не поддерживает \z,

Другие вопросы по тегам