Это меня тоже удивило. В регулярных выражениях .NET $
не совпадает до разделителя строк , оно совпадает до перевода строки - символа \n
. Такое поведение согласуется с регулярным выражением Perl, но, на мой взгляд, все еще неправильно. Согласно стандарту Unicode , $
должно совпадать до любого из:
\n
, \r\n
, \r
, \x85
, \u2028
, \u2029
, \v
или \f
... и никогда не совпадать между \r
и \n
. Java соответствует этому (кроме \v
и \f
), но .NET, появившаяся намного позже Java и поддерживающая Unicode по крайней мере так же хорошо, как Java, распознает только \n
. Можно подумать, что они по крайней мере будут правильно обрабатывать \r\n
, учитывая, как сильно Microsoft связана с этим разделителем строк.
Имейте в виду, что .
следует той же схеме: он не соответствует \n
(если не установлен однострочный режим), но соответствует соответствует \r
. Если бы вы использовали .+
вместо \w+
в своем регулярном выражении, вы, возможно, не заметили эту проблему; возврат каретки был бы включен в совпадение, но консоль проигнорировала бы его при печати результатов.
РЕДАКТИРОВАТЬ: Если вы хотите разрешить возврат каретки, не включив ее в свои результаты, вы можете заменить якорь на следующую: (?=\r?\n
.