c# - 使用交替和分组结构

标签 c# regex

最初我想要一个解析月份数字的正则表达式。起初我想出了以下正则表达式:

^([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/

相关文章:

regex - 如何确定正则表达式中的子字符串?

regex - Perl 正则表达式组合捕获组和第 n 个字符串

mysql - 字符串中的数字正则表达式搜索

javascript - javascript中的正则表达式连字符问题

c# - String.StartsWith 使用 StringComparison.OrdinalIgnoreCase 的性能

c# - 使用 Max 的 NHibernate QueryOver 子集合

c# - 我应该在 T-SQL 中进行错误处理吗?

c# - ASP.NET 中的 Crystal Report 问题 - ExportToHttpResponse

c# - Entity Framework - 如何从联结表中删除数据

javascript - JSLint 在 “Insecure ' 上从 JavaScript : The Good Parts - ignore? 报告 ^'” "^&;"