【问题标题】:Regular Expression for exactly N elements, not less, not more正好 N 个元素的正则表达式,不多不少
【发布时间】:2015-10-11 05:08:08
【问题描述】:

我试图找出正则表达式用于查找与恰好 N 次出现的匹配项,而不是更少,而不是更多,一组字符。这看起来是一个非常简单的任务,但我一直找不到合适的正则表达式。

更具体地说,我想要一个正则表达式来判断给定字符串是否正好包含 3 位数字 - 不是更少,不是更多。

我以为我可以通过将 3 位数字视为一个组并在其后添加一个量词 {1} 来实现它,但它不起作用。

另外,我希望 [0-9][0-9][0-9] 也能正常工作,但又没有。对于输入集,两个 regexes 返回完全相同的结果 1、12、123、1234、12345。

下面是执行我尝试过的代码示例,如上所述。

class Program
{
    static void Main(string[] args)
    {
        List<Regex> regexes = new List<Regex> { new Regex("\\d{3}"), new Regex("[0-9][0-9][0-9]"), new Regex("(\\d{3}){1}") };
        List<int> numbers = new List<int> { 1, 12, 123, 1234, 12345 };

        foreach(Regex regex in regexes)
        {
            Console.WriteLine("Testing regex {0}", regex.ToString());
            foreach (int number in numbers)
            {
                Console.WriteLine(string.Format("{0} {1}", number, regex.IsMatch(number.ToString()) ? "is a match" : "not a match"));
            }
            Console.WriteLine();
        }
    }
}

上面程序的输出是:

显然,从所有输入值中,只有 123 个匹配。 将“123”单独视为匹配的正则表达式是什么?

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    您应该寻找n 字符后跟一个非字符。因此,如果您正在寻找数字,您应该寻找n 数字,后跟一个非数字。确保您也在正则表达式前面加上一个非数字。

    【讨论】:

    • 但我不知道 - 我不想知道 - 我的 3 位数字之前或之后的内容。
    • 正是这个点,只要它不是数字。这是由[^\d] 指定的。所以,你的表达将是[^\d]\d{3}[^\d]
    • 但它看起来不太好,检查一下:regexr.com/3be8q。它匹配不应该匹配的东西(但你的正则表达式要求它)。
    • 这个方法只会找到三个数字,如果它们不是字符串中的第一个或最后一个字符。例如,它与regexr.com/3be8t 中的任何一个三位数字都不匹配。
    • 修复它:^[^\d]*\d{3}[^\d]*$
    【解决方案2】:

    您应该使用前缀^ 表示字符串的开始,使用$ 表示结束。有关工作示例,请参阅 http://regexr.com/3be8e

    【讨论】:

    • 对了,我今天刚在我的博客上贴了一个推荐正则表达式的链接,太棒了。
    • 所以我刚刚了解到......使用开始和结束锚点是没有意义的 - 除非你添加多行标志?
    • @Veverke regexr 使用多行文本框进行输入,它不会像在 C# 中那样将其上的每一行视为不同的输入。除非您使用正则表达式指定多行,否则 ^$ 匹配整个块的开头和结尾:第一行的开头到最后一行的结尾。
    • @unxnut 不应该匹配,字符串应该包含三个数字
    【解决方案3】:

    你所有的正则表达式都是 3 位数的 anywhere 输入。您正在寻找:

    new Regex("^\\d{3}$")
    

    ^ 匹配输入的开头,$ 匹配输入的结尾。所以这个正则表达式声明,“从一开始,必须有三个数字,然后期待结束。”

    【讨论】:

    • 哦不...啊 :) 我总是忘记开头/结尾的东西。
    • 当然不是,我忘了添加“m”(多行)标志。
    猜你喜欢
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    相关资源
    最近更新 更多