C# System.RegEx соответствует LF, когда это не должно

Следующее возвращает true

Regex.IsMatch("FooBar\n", "^([A-Z]([a-z][A-Z]?)+)$");

так же

Regex.IsMatch("FooBar\n", "^[A-Z]([a-z][A-Z]?)+$");

По умолчанию RegEx находится в режиме SingleLine, поэтому $ не должно совпадать с \n. \n недопустимый символ.

Это должно соответствовать одному ASCII PascalCaseWord (да, это будет соответствовать конечной кепке)

Не работает с любыми комбинациями RegexOptions.Multiline | RegexOptions.Singleline

Что я делаю неправильно?

2 ответа

Решение

В.NET Regex, $ якорь (как в PCRE, Python, PCRE, Perl, но не в JavaScript) соответствует концу строки или позиции перед последней новой строкой ( "\n" ) символ в строке.

Смотрите эту документацию:

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

Ни один модификатор не может переопределить это в регулярном выражении.NET (в PCRE вы можете использовать DPCRE_DOLLAR_ENDONLY модификатор).

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

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

Краткий тест на C#:

Console.WriteLine(Regex.IsMatch("FooBar\n", @"^[A-Z]([a-z][A-Z]?)+$"));  // => True
Console.WriteLine(Regex.IsMatch("FooBar\n", @"^[A-Z]([a-z][A-Z]?)+\z")); // => False

Из википедии:

$ Соответствует конечной позиции строки или позиции непосредственно перед завершающей строкой новой строкой. В линейных инструментах это соответствует конечной позиции любой строки.

Таким образом, вы спрашиваете, есть ли заглавная буква после начала начала строки, за которым следует любое количество раз (ноль или одна буква), после которого следует конец строки или позиция перед новой строкой.

Это все кажется правдой.

И да, кажется, есть некоторое несоответствие между различными источниками документации о том, что рассматривается как перевод строки и как $ работает или должен работать точно. Это всегда напоминает мудрость:

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

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