正则表达式匹配一定数量的字符并允许其间的空格

时间:2016-12-19 08:59:42

标签: c# regex

我目前正在制作一个需要匹配8位数的正则表达式。但有时会发生这些数字之间有空格或点。这是我目前正在使用的正则表达式。

([0-9\ ?.?]{7,16})

它在大多数情况下工作正常,但我遇到的问题是它有时会匹配数字,并且有很多空格跟踪它,所以你会得到类似1234 / s / s / s / s(/ s代表空间)或者有时它只是匹配空格。

我想要的是一个始终匹配至少8位的正则表达式,并且还允许空格和点而不检测少于8位数。我知道这可能是一个愚蠢的问题,但我找不到任何我需要的地方。

2 个答案:

答案 0 :(得分:3)

您的([0-9\ ?.?]{7,16})表达式匹配7到16次出现的任何字符,可以是数字,空格,?.。是的,?内的[...]是文字?,而不是量词。

您需要使用与数字([0-9])匹配的表达式,然后使用空格或句点([ .])的正好7个序列,后跟1位数,并确保您不是匹配123.156.78.146中的数字,您可以使用特殊边界:

(?<!\d[ .]?)\d(?:[. ]?\d){7}(?![ .]?\d)

如果空格或.在数字之间只能是0到1;或者 - 如果空格/点可以出现0次或更多次,

(?<!\d[ .]*)\d(?:[. ]*\d){7}(?![ .]*\d)

请参阅regex demo

如果(?<!\d[ .]*).(s)或空格后面的数字开头,那么(?![ .]*\d)是一个负面的后视,如果以任何匹配开头都会失败如果您需要的7位数字跟随.(s)或空格和数字,则前瞻将使比赛失败。

答案 1 :(得分:1)

要解决此问题,请自行描述问题。你想匹配一个数字,然后是七个重复的空格或点后跟一个数字。这会导致像\d([ .]?\d){7}这样的正则表达式。为避免收集七次捕获,请在:?之后添加(。要捕获整个字符串,请将其括在括号中。添加两个更改都会得到表达式(\d(:?[ .]?\d){7})。如果数字之间允许多个空格或点,则将?更改为*

为了获得字符串中的八位数字,我建议使用上面捕获的字符串并替换任何空格或点。