.Net 正则表达式匹配 $ 与字符串的结尾而不是行的结尾,即使启用了多行 [英] .Net regex matching $ with the end of the string and not of line, even with multiline enabled

查看:11
本文介绍了.Net 正则表达式匹配 $ 与字符串的结尾而不是行的结尾,即使启用了多行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试突出显示 Markdown 代码,但遇到了 .NET 正则表达式多行选项的这种奇怪行为.

I'm trying to highlight markdown code, but am running into this weird behavior of the .NET regex multiline option.

以下表达式:^(#+).+$ 适用于任何在线正则表达式测试工具:

The following expression: ^(#+).+$ works fine on any online regex testing tool:

但它拒绝与 .net 一起使用:

But it refuses to work with .net:

它似乎没有考虑到 $ 标签,只是突出显示直到字符串末尾的所有内容,无论如何.这是我的 C#

It doesn't seem to take into account the $ tag, and just highlights everything until the end of the string, no matter what. This is my C#

RegExpression = new Regex(@"^(#+).+$", RegexOptions.Multiline)

我错过了什么?

推荐答案

很明显,您的文本包含除 LF 之外的换行符.在 .NET 正则表达式中,点匹配除 LF 之外的任何字符(换行符, ).

It is clear your text contains a linebreak other than LF. In .NET regex, a dot matches any char but LF (a newline char, ).

参见 多行模式 MSDN 正则表达式参考

See Multiline Mode MSDN regex reference

默认情况下,$ 只匹配输入字符串的结尾.如果您指定 RegexOptions.Multiline选项,它匹配换行符 ( ) 或输入字符串的结尾.但是,它不匹配回车/换行字符组合.要成功匹配它们,请使用子表达式 ?$ 而不是 $.

By default, $ matches only the end of the input string. If you specify the RegexOptions.Multiline option, it matches either the newline character ( ) or the end of the input string. It does not, however, match the carriage return/line feed character combination. To successfully match them, use the subexpression ?$ instead of just $.

所以,使用

@"^(#+).+?
?$"

.+? ?$ 将延迟匹配除 LF 之外的任何一个或多个字符,直到换行符之前的第一个 CR(这是可选的).

The .+? ?$ will match lazily any one or more chars other than LF up to the first CR (that is optional) right before a newline.

或者只是使用否定字符类:

Or just use a negated character class:

@"^(#+)[^
]+"

[^ ]+ 将匹配 CR/LF 以外的一个或多个字符.

The [^ ]+ will match one or more chars other than CR/LF.

这篇关于.Net 正则表达式匹配 $ 与字符串的结尾而不是行的结尾,即使启用了多行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆