正则表达式错误地匹配%和$

时间:2013-07-10 17:26:25

标签: javascript regex

我在JavaScript中有一个正则表达式,允许在电话字段中使用数字和(,.+() -)字符

我的正则表达式是[0-9-,.+() ]

适用于数字以及六位以上的字符,但它也允许%$等字符不在上面的列表中。

3 个答案:

答案 0 :(得分:4)

即使你不必这样做,我也总是能够避免使用元字符(更容易阅读和减少痛苦):

[0-9\-,\.+\(\) ]

但是这不会像你期望的那样工作,因为它只会匹配一个有效字符,同时允许字符串中的其他无效字符。我想你想要将整个字符串与至少一个有效字符匹配:

^[0-9\-,\.\+\(\) ]+$

您的原始正则表达式实际上并不匹配%。它正在做的是匹配有效字符,但问题是它只匹配一个。因此,如果您使用字符串435%,则它与4匹配,因此正则表达式报告它具有匹配项。

如果您尝试将其与一个无效字符匹配,则它将不匹配。因此,您的原始正则表达式与字符串%

不匹配
> /[0-9\-,\.\+\(\) ]/.test("%")
  false

> /[0-9\-,\.\+\(\) ]/.test("44%5")
  true

> "444%6".match(/[0-9\-,\.+\(\) ]/)
  ["4"] //notice that the 4 was matched.

回到关于转义的问题,我发现它更容易逃避,而不是担心特定元字符在字符类中有效的不同规则。例如,-仅在以下情况下有效:

  • 在具有正确顺序的实际角色类中使用时,例如[a-z](但 [z-a]
  • 用作第一个或最后一个字符时,或单独用作[-a][a-][-]
  • 之后使用 [0-9-,][a-d-j]之类的范围时(但请注意[9-,]无效且[a-d-j]e不匹配字母f到{{1}})。

由于这些原因,我逃避元字符,以明确我想要匹配实际字符本身并消除歧义。

答案 1 :(得分:2)

你只需要锚定你的正则表达式:

^[0-9-,.+() ]+$

在字符类中,除]-外,不需要转义特殊字符。

但是,这些char在以下情况下不会被转义:

]在char类[]]中是唯一的 -位于char类的开始[-abc]或结尾[abc-]或最后结束范围[a-c-x]之后

答案 2 :(得分:-1)

在RegExp中转义具有特殊含义的字符。如果你不确定并且它不是字母字符,那么逃避它通常也不会有害。

如果整个字符串必须匹配,请在RegExp中包含字符串的开始^和结束$

/^[\d\-,\.\+\(\) ]*$/