我在C#中使用以下正则表达式,虽然它几乎完全按预期报告成功和失败,但鉴于匹配成功,捕获组的实际内容似乎不可能。我对相同的正则表达式有两个不同的例子,我不确定它们是否相关。
Regex specialHandlerPattern = new Regex("^\\[((Regex):(.+))|((\\w+):([^:]+)(:([0-9\\.]+))?)\\]$");
Match m = specialHandlerPattern.Match("[Regex:^Aardvark_[0-2]:[0-9]+]");
//Match m = specialHandlerPattern.Match("[InclusiveTolerance:0.123:0.457]");
if (m.Success) {
Console.WriteLine("Success!");
int i = 0;
foreach( Group g in m.Groups) {
Console.WriteLine("\n\tGroup {0} = \"{1}\"", i++, g);
}
在第一种情况下,匹配按预期成功。但是,第1组和第3组的内容不正确......它们都包含一个终端']',在指定这些组之外:
Success!
Group 0 = "[Regex:^Aardvark_[0-2]:[0-9]+]"
Group 1 = "Regex:^Aardvark_[0-2]:[0-9]+]"
Group 2 = "Regex"
Group 3 = "^Aardvark_[0-2]:[0-9]+]"
Group 4 = ""
Group 5 = ""
Group 6 = ""
Group 7 = ""
Group 8 = ""
在第二种情况下(切换注释行),匹配也按预期成功。但是,组0的内容不正确...领先的'['缺失:
Success!
Group 0 = "InclusiveTolerance:0.123:0.457]"
Group 1 = ""
Group 2 = ""
Group 3 = ""
Group 4 = "InclusiveTolerance:0.123:0.457"
Group 5 = "InclusiveTolerance"
Group 6 = "0.123"
Group 7 = ":0.457"
Group 8 = "0.457"
我不明白这些匹配是如何成功的并且仍然会产生这些组 - 特别是在第一种情况下,似乎在这些组中包含额外的']'会导致正则表达式匹配失败然后回溯。 C#正则表达式是否有一些特殊性我根本不知道?
编辑: 也许是个有说服力的细节? 以下字符串(与我的意图相反)将成功匹配:
"[Regex:^Aardvark_[0-2]:[0-9]+"
"InclusiveTolerance:0.123:0.457]"
答案 0 :(得分:0)
也许这可以帮助您诊断问题
这是你的正则表达式,格式化和扩展。
只是一个建议 - 尝试像RegexFormat4这样的正则表达式格式化应用程序
这将允许您从格式化位置进行编辑和测试,然后将其压缩以进行生产。
# DO THIS
^ # Beginning of string
\[
( # (1 start)
( Regex ) # (2)
:
( .+ ) # (3)
) # (1 end)
|
# OR,
( # (4 start)
( \w+ ) # (5)
:
( [^:]+ ) # (6)
( # (7 start)
:
( [0-9\.]+ ) # (8)
)? # (7 end)
) # (4 end)
\]
$ # End of string
也许你只需要移动锚点^ $和括号在之外
"^\\[(?:((Regex):(.+))|((\\w+):([^:]+)(:([0-9\\.]+))?))\\]$"
^ # Beginning of string
\[
(?:
# DO THIS
( # (1 start)
( Regex ) # (2)
:
( .+ ) # (3)
) # (1 end)
|
# OR,
( # (4 start)
( \w+ ) # (5)
:
( [^:]+ ) # (6)
( # (7 start)
:
( [0-9\.]+ ) # (8)
)? # (7 end)
) # (4 end)
)
\]
$ # End of string