正则表达式 - 匹配除 + 以外的任何字符,空字符串也应被匹配。

39

我在使用JavaScript中的正则表达式时遇到了一些问题。 我需要一种匹配除+字符外任何字符的方法,空字符串也应该匹配。

[^+]几乎符合我的要求,但它无法匹配空字符串。 我尝试过[^+]*,认为“任何字符都不是+,零次或多次”,但这将匹配所有内容,包括+


[^+]* 怎么可能匹配 + 呢?这没有道理。你的表达式肯定有其他问题。 - Scott Rippey
1
@ScottRippey:在我的回答中,我猜测*量词通过成功匹配没有与+不同的零个字符来允许匹配成功。如果没有锚点或其他断言,它理论上可以匹配+之前或之后的任何位置,从而允许整个字符串匹配成功。(当然它会在+之前匹配,因为那是第一个匹配项,而且只会停留在那里)这种评估对你来说没有意义吗? - Code Jockey
3个回答

45

添加{0,1}以使其只匹配零次或一次,既不多也不少:

[^+]{0,1}

或者,正如FailedDev所指出的那样,? 也可以使用:

[^+]?

如预期,使用Chrome的JavaScript控制台进行测试时,"+"没有匹配项,但会匹配其他字符:

x = "+"
y = "A"

x.match(/[^+]{0,1}/)
[""]

y.match(/[^+]{0,1}/)
["A"]

x.match(/[^+]?/)
[""]

y.match(/[^+]?/)
["A"]

3
不需要对它进行转义,其次{0,1}=?。+1然而。 - FailedDev
两个选项似乎都匹配所有内容,包括 http://www.regular-expressions.info/javascriptexample.html 上的 +。 - zaq
根据上述网站,那个不匹配任何内容。 - zaq
@zaq:看起来那个网站允许你测试正则表达式是否与给定字符串的任何部分匹配。因此,要使用该网站测试[^+]*是否与整个字符串匹配,您需要将其放在^([^+]*)$的形式中。 - ruakh
似乎就是这样了。需要用^$来限定它。谢谢。 - zaq
显示剩余2条评论

30
  • [^+]的意思是“匹配任何一个不是+的单个字符”
  • [^+]*的意思是“匹配任何一个不是+的多个字符”,这似乎与你想要的非常接近,但它会匹配零个字符,如果第一个字符(甚至全部字符)是+

使用锚点来确保表达式验证整个字符串:

^[^+]*$

意思是:

^       # assert at the beginning of the string
[^+]*   # any character that is not '+', zero or more times
$       # assert at the end of the string

8

如果您只是想测试字符串是否不包含+,那么应该使用:

^[^+]*$

仅当整个字符串没有 + 时,才会匹配。


这实际上只是更大表达式的一部分,因此我不一定想匹配整个字符串。 - zaq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接