[英]Parsing string using regex where delimiter varies
我需要解析以下字符串:
<!-- MOCK -->
<!--MOCK-->
<!-- MOCK:SENT;FAIL -->
<!--MOCK:SENT;SUCCESS-->
<!--MOCK:SENT; SUCCESS-->
<!--MOCK:SENT ; SUCCESS-->
<!--MOCK:SENT -->
<!-- MOCK:SENT-->
<!-- MOCK : SENT -->
<!-- MOCK: SENT -->
<!-- MOCK :SENT -->
因為這些可能是我想在合理范圍內為各種間距提供支持的人員輸入的。
我已經達到以下正則表達式。
<!-- *(?<mode>.*?(?=[ \-:])).*: *(?<responses>.*?(?= *-->))
這適用於以上所有測試字符串,除了前兩個字符串。 在前兩種情況下,“模式”組恢復為空,這是我不理解的,因為我認為?<mode>.*?(?=[ \\-:])
會收集所有字符,直到出現空格為止,破折號或冒號。 如果我將中間的.*: *
更改為.*:? *
.*:? *
然后,我獲得了所有的“模式”值,但是卻丟失了所有的“響應”值。
我的測試代碼在.NET Fiddle( https://dotnetfiddle.net/HzIXch )中,但此處出於完整性考慮。
var regex = new Regex(@"<!-- *(?<mode>.*?(?=[ \-:])).*: *(?<responses>.*?(?= *-->))");
var values = new[] {
"<!-- MOCK -->",
"<!--MOCK-->",
"<!-- MOCK:SENT;FAIL -->",
"<!--MOCK:SENT;SUCCESS-->",
"<!--MOCK:SENT; SUCCESS-->",
"<!--MOCK:SENT ; SUCCESS-->",
"<!--MOCK:SENT -->",
"<!-- MOCK:SENT-->",
"<!-- MOCK : SENT -->",
"<!-- MOCK: SENT -->",
"<!-- MOCK :SENT -->",
};
foreach (var value in values)
{
var match = regex.Match(value);
Console.WriteLine($"Mode: [{match.Groups["mode"].Value}], Responses: [{match.Groups["responses"].Value}]");
}
我認為這里不需要使用前瞻。 這就是我要做的:
(?<mode>[AZ]+)([ \\-:]+(?<responses>[AZ; ]+\\b))?
https://dotnetfiddle.net/6xpkt1
關於發布的其他答案以及對您的問題的評論,我完全不同意。 \\s
與文字空間不同。 它包含所有空格字符,如果只期望空格,可能會惹上麻煩。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.