最初我想要一个正则表达式来解析月份数字。首先我想出了以下正则表达式:
^([1-9]{1})|(1[012])$
它匹配任何正数,表示它匹配该数字的高位数字,即:
1 => 1
2 => 2
...
9 => 9
10=> 1
...
19=> 1
20=> 2
...
为什么会这样?我认为交替结构将使Regex
选择左边或右边,同时有^
and &
使其匹配整个字符串。我缺少什么?
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
the ^([1-9]{1})
正则表达式匹配的一部分。你可以看到为什么20
与这个损坏的正则表达式匹配。
另外,您仅打印组#1 的内容并忽略组#2 的内容。因此,如果第二组括号碰巧匹配,您将不会在打印输出中看到它。
if (m.Success)
Console.WriteLine(m.Groups[0].Value);
你的第二个正则表达式通过包围两个来解决问题|
带括号的替代项,留下^
and $
锚点在外面,只留下一组括号,因此结果始终位于组 #1 中。
就其价值而言,{1}
是不必要的。你可以写:
^([1-9]|1[012])$
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)