4

我做了以下正则表达式:

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

它似乎有效。也就是说,它会匹配一个 5 位数字或一个只有 1 个连字符的 5 位数字,但连字符不能是开头或结尾。

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

谁能建议一个更简单的正则表达式?

附加说明:我将此正则表达式放入一个 XML 文件中,供 ASP.NET 应用程序使用。我无权访问 .net 后端代码。但我怀疑他们会这样做:

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

5 回答 5

10

您需要使用前瞻:

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

解释:

  • 要么是从头到尾\d{25},25位数。
  • 或者:它是[\d\-](数字或连字符)的 26 个字符并且它匹配\d+-\d+- 意味着它在中间只有一个连字符。

正则表达式可视化

带有测试用例的工作示例

于 2013-08-22T19:25:15.617 回答
5

你可以使用这个正则表达式:

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

前瞻确保只有 1 个破折号,而字符类确保第一个和最后一个之间有 23 个数字。虽然我认为可能会更短。

编辑:稍微短一点的 xP

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

我承认,有点像科比的。

于 2013-08-22T19:22:41.970 回答
0

如果您根本不关心长度(即您只需要带有可选连字符的数字字符串),您可以使用:

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

(您可能需要为此添加行/单词边界,具体取决于您的情况)

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

于 2013-08-22T20:30:19.133 回答
0

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

 ^(\d+)-?(\d+)$
于 2013-08-22T21:27:30.253 回答
0

这将匹配 25 位数字和中间的一个连字符:

^(?=(-*\d){25})\d.{24}\d$
于 2013-08-22T22:13:51.100 回答