正则表达式为x个数字,只有一个连字符?

时间:2013-08-22 19:15:29

标签: asp.net xml regex

我做了以下正则表达式:

(\d{5}|\d-\d{4}|\d{2}-\d{3}|\d{3}-\d{2}|\d{4}-\d)

它似乎有效。也就是说,它将匹配一个5位数字或5位数字,其中只有1个连字符,但连字符不能是引导或结束。

我想要一个类似的正则表达式,但是对于25位数字。如果我使用与上面相同的策略,那么正则表达式会很长。

有人可以建议更简单的正则表达式吗?

附加说明: 我将这个正则表达式放在一个XML文件中,该文件将由ASP.NET应用程序使用。我无法访问.net后端代码。但我怀疑他们会做点什么:

Match match = Regex.Match("Something goes here", "my regex", RegexOptions.None);

5 个答案:

答案 0 :(得分:10)

您需要使用前瞻:

^(?:\d{25}|(?=\d+-\d+$)[\d\-]{26})$

说明:

  • 从开始到结束都是\d{25},25位数。
  • 或者:它是[\d\-](数字或连字符)AND的26个字符,它匹配\d+-\d+ - 意味着它中间只有一个连字符。

Regular expression visualization

Working example with test cases

答案 1 :(得分:5)

您可以使用此正则表达式:

^[0-9](?:(?=[0-9]*-[0-9]*$)[0-9-]{24}|[0-9]{23})[0-9]$

前瞻确保只有1个破折号,角色类确保第一个和最后一个之间有23个数字。我想可能会变短。

编辑:a'位'更短的xP

^(?:[0-9]{25}|(?=[^-]+-[^-]+$)[0-9-]{26})$

虽然有点类似于Kobi,但我承认。

答案 2 :(得分:0)

如果你对长度一点都不挑剔(也就是说你只想要一串带可选连字符的数字),你可以使用:

([\d]+-[\d]+){1}|\d

(您可能需要根据具体情况为此添加行/字界限)

如果您需要具有特定的匹配长度,则此模式不起作用。 Kobi的答案可能更适合你。

答案 3 :(得分:0)

我认为最快的方法是做一个简单的匹配,然后加上捕获缓冲区的长度,为什么在正则表达式中尝试数学,没有任何意义。

 ^(\d+)-?(\d+)$

答案 4 :(得分:0)

这将匹配25位数字,中间恰好有一个连字符:

^(?=(-*\d){25})\d.{24}\d$