Регулярное выражение для совпадения с точной строкой (не разрешать завершать символ новой строки)
В.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
,