Каждый единственный аромат регулярного выражения, который я когда-либо использовал, всегда имел ".". символ соответствует всем, кроме новой строки (\ r или \n)... если, конечно, вы не включите однострочный флаг.
Итак, когда я попробовал следующий код на С#, я был в шоке:
Regex rgx = new Regex(".");
if (rgx.Match("\r\n").Success)
MessageBox.Show("There is something rotten in the state of Redmond!");
Он показал сообщение. Чтобы убедиться, что я не схожу с ума, я попробовал следующий код JavaScript:
if (/./.test("\r\n"))
alert("Something wrong with JavaScript too.");
В JavaScript не было показано сообщение, что означает, что он работает точно так, как должен.
По-видимому, "." символ в .NET соответствует символу "\ r". Я проверил документацию, чтобы узнать, есть ли упоминание об этом:
Подстановочный знак: соответствует любому одиночному символу кроме \n.
Ух ты... с каких пор аромат регулярного выражения когда-либо совпал с точкой возврата каретки? Вы могли бы подумать, что .NET будет вести себя как все остальные варианты Regex... особенно потому, что это в среде Windows, которая использует "\ r\n" в качестве разделителей строк.
Есть ли какой-либо флаг/параметр, который я могу включить, чтобы он работал так же, как и в других вариантах Regex? Существуют ли альтернативные решения, которые не включают замену всех символов .
на [^\r\n]
?