最初我想要一个解析月份数字的正则表达式。起初我想出了以下正则表达式:
^([1-9]{1})|(1[012])$
并且匹配任意正数,表示匹配该数的高位,即:
1 => 1
2 => 2
...
9 => 9
10=> 1
...
19=> 1
20=> 2
...
为什么会这样?我认为交替构造将使 Regex
选择左侧或右侧,同时使用 ^
和 &
使其匹配整个字符串.我错过了什么?
P.S.:我现在确实有一个工作的正则表达式(一个只匹配从 1 到 12 的数字);它是:
^([1-9]{1}|1[012])$
我不明白为什么它如此有效......
这是我用来测试的代码:
Regex r = new Regex(@"^([1-9]{1})|(1[012])$");//^([1-9]{1}|1[012])$
for (int i = -5; i < 35; i++)
{
Console.Write(i);
Console.Write("\t");
Match m = r.Match(i.ToString());
if (m.Success)
Console.WriteLine(m.Groups[0].Value);
else
Console.WriteLine("false");
}
最佳答案
像这样阅读第一个正则表达式:
^([1-9]{1}) # match this
| # ...OR...
(1[012])$ # match this
匹配字符串开头的数字 1-9 并将其存储在组 #1 中,或者匹配字符串末尾的数字 10-12 并将其存储在组 #2 中。
使用第一个成功的匹配项,因此当您匹配 10
时,正则表达式的 ^([1-9]{1})
部分匹配。您可以看到为什么 20
与这个损坏的正则表达式匹配。
此外,您只打印出第 1 组的内容而忽略第 2 组的内容。因此,如果第二组括号恰好匹配,您将不会在打印输出中看到它。
if (m.Success)
Console.WriteLine(m.Groups[0].Value);
您的第二个正则表达式通过用括号包围两个 |
替代方案来解决问题,将 ^
和 $
anchor 留在外面,并且只留下一组括号,所以结果总是在组 #1 中。
就其值(value)而言,{1}
是不必要的。你可以这样写:
^([1-9]|1[012])$
关于c# - 使用交替和分组结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12905782/