使用交替和分组构造
最初我想要一个正则表达式解析月份数字。 起初我想出了以下正则表达式:
^([1-9]{1})|(1[012])$
它匹配任何正数,表示它匹配数字的高位数,即:
1 => 1 2 => 2 ... 9 => 9 10=> 1 ... 19=> 1 20=> 2 ...
为什么会这样? 我认为交替构造将使正则Regex
选择左边或右边,而^
和&
使它匹配整个字符串。 我错过了什么?
PS:我现在有一个正在运行的正则表达式(一个只匹配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);
你的第二个正则表达式通过包围两个|
解决问题 带括号的替代方案,将^
和$
锚留在外面,只留下一组括号,因此结果总是在组#1中。
而对于它的价值, {1}
是不必要的。 你可以写:
^([1-9]|1[012])$
交替运算符具有所有正则表达式运算符的最低优先级。
字面解释的两个正则表达式之间的区别是:
( [BEGIN]([1-9]) ) OR ( (1[012])[END] )
VS
[BEGIN] ( [1-9] OR 1[012] ) [END]