很明显您的文本包含除LF以外的换行符。在.NET正则表达式中,点匹配除LF(一个换行符,\n
)以外的任何字符。
默认情况下,
$
仅匹配输入字符串的结尾。如果指定了RegexOptions.Multiline选项,则它将匹配换行符(\n
)或输入字符串的结尾。但是,它不匹配回车符/换行符组合。要成功匹配它们,请使用子表达式\r?$
而不是只使用$
。
因此,请使用
@"^(#+).+?\r?$"
.+?\r?$
将懒惰地匹配除LF以外的一个或多个字符,直到第一个换行符(可选)之前的CR。
或者只需使用否定字符类:
@"^(#+)[^\r\n]+"
[^\r\n]+
匹配除 CR/LF 之外的一个或多个字符。
Regex.Replacec
时,它会替换掉 \r
字符。我该怎么解决? - Denis535(?=\r?$)
。 - Denis535你的代码已经很不错了。唯一缺少的是,即使使用多行选项,.
也无法匹配换行符。你可以通过两种不同的方式解决这个问题。
最简单的方法是使用 RegexOptions.Singleline 标志,它会将换行符视为字符。这样,^
仍然匹配字符串的开头,$
匹配字符串的结尾,.
匹配包括换行符在内的所有内容。
另一种修复此问题的方法(虽然我不建议你在这种情况下使用)是修改你的正则表达式以明确允许换行符。你只需将任何 .
替换为 (?:.|\n)
,表示任何字符或换行符。对于你的示例,你最终会得到 ^(#+)(?:.|\n)+$
。如果你想确保首先有一个非换行符字符,请添加一个额外的点:^(#+).(?:.|\n)+$
(?:.|\n)+
模式。它非常低效,可能会因为需要执行大量回溯(或懒惰限定符情况下的扩展),导致系统冻结。在 .NET 中,请始终使用带有 (?s)
内联修饰符或 RegexOptions.Singleline
的 .
。您无需像工作区中使用 [\s\S]
一样的解决方法,因为您可以在 .NET 正则表达式中使用修改器组。例如: ^.*\r?\n(?s:.*)
。 - Wiktor Stribiżew
@"^(#+).+?\r?$"
。 - Wiktor Stribiżew