如何使用正则表达式将可变长度数字与中间的连字符进行匹配?

时间:2009-02-26 12:51:41

标签: .net regex

我想要以下的.net正则表达式:

用户可以输入tcm:12312312-221231323tcm:23121231-23423423-34234234

等值

除“tcm”和连字符之外的所有条目都是数字。将有一个或两个连字符。

5 个答案:

答案 0 :(得分:4)

^tcm:\d{8}-(\d{9}|\d{8}-\d{8})$

那是tcm :(八位数) - (九位数)或tcm :(八位数) - (八位数) - (八位数)


^tcm:\d+(-\d+){1,2}$

如果您正在寻找tcm :(某些数字) - (某些数字)或tcm :(某些数字) - (某些数字) - (某些数字)

答案 1 :(得分:2)

尝试这个,需要两组或三组

tcm:\d+-\d+(-\d+)?

如果对数字的限制有限制,请尝试以下方法:

tcm:\d{4,8}-\d{4,8}(-\d{4,8})?

(其中4和8是每组的最小值和最大值)

答案 2 :(得分:0)

你的意思是:

TCM:[\ d - ] +

答案 3 :(得分:0)

好吧,数字中间的短划线不是数字......;)

以下是一些选项:

如果破折号是可选的:

^tcm:[\d\-]+$

如果破折号是可选的,但可能不是第一个或最后一个:

^tcm:\d[\d\-]*\d$

如果至少需要一个破折号:

^tcm:\d*-[\d\-]+$

如果至少需要一个短划线,但可能不会先发生或最后发生:

^tcm:\d+-[\d\-]*\d$

如果短划线是可选的,但可能不是先发生,也可能不发生或相邻:

^tcm:\d+(-\d+)*$

答案 4 :(得分:0)

我不清楚您是否要验证输入并只是匹配输入,或者您是否要提取数据。

如果您只需要匹配输入以验证它,那么:

 ^tcm:\d+(-\d+){1,2}$

只有在有2组或3组数字时才会匹配,不会少,不再有。

如果您需要考虑可能出现的空白,可以像这样修改正则表达式:

 ^tcm\s*:\s*\d+\s*(-\s*\d+){1,2}\s*$

如果您想提取每组数字:

  • 在Perl中,只有当整个模式匹配时,才会使用包含2或3组数字的@result数组(subject字符串包含要提取数据的行从)。

    my @result = $subject =~ /^tcm:(\d+)-(\d+)(?:-(\d+))?$/;
    
  • 在C#中你可以做同样的事情:

    MatchCollection results = null;
    Regex r = new Regex(@"^tcm:(\d+)-(\d+)(?:-(\d+))?$");
    results = r.Matches(subject);
    if ((results.Count == 2) || ((results.Count == 3))) {
        // use results.Item[] to access each group of digits
    } else {
        // The subject doesn't match
    }