我目前正在制作一个需要匹配8位数的正则表达式。但有时会发生这些数字之间有空格或点。这是我目前正在使用的正则表达式。
([0-9\ ?.?]{7,16})
它在大多数情况下工作正常,但我遇到的问题是它有时会匹配数字,并且有很多空格跟踪它,所以你会得到类似1234 / s / s / s / s(/ s代表空间)或者有时它只是匹配空格。
我想要的是一个始终匹配至少8位的正则表达式,并且还允许空格和点而不检测少于8位数。我知道这可能是一个愚蠢的问题,但我找不到任何我需要的地方。
答案 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})
。如果数字之间允许多个空格或点,则将?
更改为*
。
为了获得字符串中的八位数字,我建议使用上面捕获的字符串并替换任何空格或点。