[英]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.