繁体   English   中英

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

[英]Regular expression for x number of digits and only one hyphen?

我做了以下正则表达式:

(\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);

您需要使用前瞻:

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

说明:

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

正则表达式可视化

带有测试用例的工作示例

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

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

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

编辑:一个'比特'更短的xP

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

我承认,有点类似于Kobi的。

如果你对长度没有挑剔(即你只想要一个带有可选连字符的数字串),你可以使用:

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM