我做了以下正则表达式:
(\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);
答案 0 :(得分:10)
您需要使用前瞻:
^(?:\d{25}|(?=\d+-\d+$)[\d\-]{26})$
说明:
\d{25}
,25位数。[\d\-]
(数字或连字符)AND的26个字符,它匹配\d+-\d+
- 意味着它中间只有一个连字符。
答案 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$