我正在尝试写一个不会匹配一定数量的空格的正则表达式,但这不符合我的预期。
我有这些字符串:
123 99999 # has 6 white spaces
321 99999 # same
123 8888 # has 3 white spaces \
321 8888 # same | - These are the lines I
1237777 | want to match
3217777 /
我想匹配最后四行,即以123或321开头,后跟6个空白字符后的任何内容:
^(123|321)[^\ ]{6}.*
这似乎没有诀窍 - 这只匹配最后两个。我错过了什么?
答案 0 :(得分:2)
" 888"
如果你匹配这个,这与[^\ ]{6}
不匹配:这就是说
[not a space][not a space][not a space][not a space][not a space][not a space]
在这种情况下,您遇到的问题是前3个字符是空格,因此它不匹配正确。
您可以使用否定前瞻^(123)|(321)(?!\s{6})
。我更喜欢它,因为它更具可读性,是编写正则表达式以匹配您不想要的,然后否定(即not
,!
等)。我对你的数据知之甚少,但我会使用\s{6}
,然后否定它。
答案 1 :(得分:1)
试试这个:
^(123|321)(?!\s{6}).*
(使用否定前瞻,看看.*
匹配中是否有6个空格)
答案 2 :(得分:1)
你在做什么语言?如果在Perl或支持PCRE的东西中,你可以简单地使用负前瞻断言:
^(123)|(321)(?!\ {6}).*
答案 3 :(得分:0)
你需要首先说它可能有3个空格,然后否认存在三个以上的空格,如下所示:
^([0-9]+)(\s{0,3})([^ ]{3})([0-9]*)$
^([0-9] +)=接受字符串开头的一个或多个数字。
(\ s {0,3})=接受零或最多三个空格。
([^] {3})=在允许的空格后禁止接下来的3个空格。
([0-9] *)=接受空格后的任何数字直到字符串结束。
或者:
^([0-9]+)(\s{0,3})(?!\s+)([0-9]*)$
这里唯一的变化是,在三个允许的空格之后,它将不再接受任何空格(我特别喜欢这个第二个选项,因为它更具可读性)。
希望它有所帮助。