簡體   English   中英

C#正則表達式匹配的子表達式返回空字符串

[英]C# regexp matched subexpressions returns empty string

我寫了這個正則表達式:

var cellPattern = new Regex(@"(?(?=\d+)\d+|\|)\s(.)\s", RegexOptions.Compiled | RegexOptions.Multiline);

並從此字符串中獲取單元格:

string field = 
"  A   B   C   D   E \n" +
"1   | X |   |   |   \n" +
" ---+---+---+---+---\n" +
"2   |   |   |   |   \n" +
" ---+---+---+---+---\n" +
"3   | O |   |   |   \n" +
" ---+---+---+---+---\n" +
"4   |   |   | X |   \n" +
" ---+---+---+---+---\n" +
"5   |   |   |   |   \n" +
"O >>> ";

我正在執行cellPattern.Matches(field); 它返回帶有 25 個匹配項的 MatchCollection,但為什么所有匹配項都將空字符串作為第一組?

PS:如果我使用命名匹配子表達式,一切都按我想要的方式工作:所有匹配項都將網格單元格作為“單元格”組

var cellPattern = new Regex(@"(?(?=\d+)\d+|\|)\s(?<cell>.)\s", RegexOptions.Compiled | RegexOptions.Multiline);

PPS:我的項目框架是.NET Framework 4.5.2

PPPS:在這個網站上,你也可以看到這種行為

這是 .NET 框架中的一個錯誤。 然后使用(?(?= ) ) ,它忽略下一組的內容,但它仍然計入組數。

當它看到(?(它設置了一個標志來忽略下一組,期望看到(?(expression) ... | ... ) ,而是有一個(?= ... ) ,所以標志是直到下一個捕獲組才重置。

解決方法是命名組,添加一個虛擬組:

(?(?=\d+)\d+|\|)()\s(.)\s

或添加另一個級別的括號:

(?((?=\d+))\d+|\|)\s(.)\s

在這種情況下,您還可以刪除條件:

(?:\d+|\|)()\s(.)\s

暫無
暫無

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

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