如何编写与一定数量的空格不匹配的正则表达式?

时间:2011-10-11 16:46:51

标签: regex whitespace

我正在尝试写一个不会匹配一定数量的空格的正则表达式,但这不符合我的预期。

我有这些字符串:

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}.*

这似乎没有诀窍 - 这只匹配最后两个。我错过了什么?

4 个答案:

答案 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]*)$

这里唯一的变化是,在三个允许的空格之后,它将不再接受任何空格(我特别喜欢这个第二个选项,因为它更具可读性)。

希望它有所帮助。