簡體   English   中英

.Net 正則表達式匹配 $ 與字符串的結尾而不是行的結尾,即使啟用了多行

[英].Net regex matching $ with the end of the string and not of line, even with multiline enabled

我正在嘗試突出顯示降價代碼,但遇到了 .NET 正則表達式多行選項的這種奇怪行為。

以下表達式: ^(#+).+$適用於任何在線正則表達式測試工具:

在此處輸入圖片說明

但它拒絕與 .net 一起使用:

在此處輸入圖片說明

它似乎沒有考慮 $ 標簽,並且只是突出顯示直到字符串末尾的所有內容,無論如何。 這是我的 C#

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

我錯過了什么?

很明顯,您的文本包含除 LF 之外的換行符。 在 .NET 正則表達式中,點匹配除 LF 之外的任何字符(換行符, \\n )。

請參閱多行模式MSDN 正則表達式參考

默認情況下, $僅匹配輸入字符串的結尾。 如果您指定RegexOptions.Multiline選項,它將匹配換行符 ( \\n ) 或輸入字符串的結尾。 但是,它不匹配回車/換行字符組合。 要成功匹配它們,請使用子表達式\\r?$而不是$

所以,使用

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

.+?\\r?$將延遲匹配除 LF 之外的任何一個或多個字符,直到換行符之前的第一個 CR(這是可選的)。

或者只使用否定字符類:

@"^(#+)[^\r\n]+"

[^\\r\\n]+將匹配 CR/LF 以外的一個或多個字符。

你所擁有的就是好的。 你唯一缺少的是. 即使使用多行選項,也不匹配換行符。 您可以通過兩種不同的方式解決此問題。

最簡單的方法是使用RegexOptions.Singleline標志,這會導致換行符被視為字符。 這樣, ^仍然匹配字符串的開頭, $匹配字符串的結尾,而. 匹配所有內容,包括換行符。

解決此問題的另一種方法(盡管我不會為您的用例推薦它)是修改您的正則表達式以明確允許換行。 為此,您只需替換任何. with (?:.|\\n)表示任意字符或換行符。 對於您的示例,您最終會得到^(#+)(?:.|\\n)+$ 如果要確保首先有一個非換行符,請添加一個額外的點: ^(#+).(?:.|\\n)+$

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM