C# Regex捕获的组与Regex成功不一致
我在C#中使用了下面的正则表达式,虽然它几乎完全按照预期报告了成功和失败,但考虑到比赛是成功的,捕获组的实际内容似乎是不可能的。对于同一个正则表达式,我有两个不同的例子,我不确定它们是否相关C# Regex捕获的组与Regex成功不一致,c#,regex,C#,Regex,我在C#中使用了下面的正则表达式,虽然它几乎完全按照预期报告了成功和失败,但考虑到比赛是成功的,捕获组的实际内容似乎是不可能的。对于同一个正则表达式,我有两个不同的例子,我不确定它们是否相关 Regex specialHandlerPattern = new Regex("^\\[((Regex):(.+))|((\\w+):([^:]+)(:([0-9\\.]+))?)\\]$"); Match m = specialHandlerPattern.Match("[Regex:^Aardvark
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]"
也许这将帮助您诊断问题。
这是您的正则表达式,已格式化并已展开。
只是一个建议-尝试像这样的正则表达式格式化应用程序。
这将允许您从格式化位置编辑和测试,然后压缩它以用于生产
# 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
也许您只需将锚定^$和括号移到外部“^\[(?:((正则表达式):(.+)|((\\w+):([^::+)(:([0-9\.]+)?)\\]$”
您是对的,“|”的范围并没有达到预期的效果。我愿意相信这是因为我在DXL学习regex时,它的实现方式不同,但回想起来,我变得不太确定了。(也就是说,我习惯于“xa | bz”与“xbz”匹配但与“xa”不匹配的实现。)
^ # 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