0

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

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

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

4

3 回答 3

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]
  • 当用作第一个或最后一个字符时,或单独使用时,so [-a][a-][-].
  • 在or之类的范围之后使用时(但请记住,这是无效的,并且与通过的字母不匹配)。[0-9-,][a-d-j][9-,][a-d-j]ef

由于这些原因,我对元字符进行转义以表明我想匹配实际字符本身并消除歧义。

于 2013-07-10T17:30:13.917 回答
2

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

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

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

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

]在 char 类中是单独的 在 char 类[]]
-的开头[-abc]或结尾[abc-] 处或在最后一个结束范围之后[a-c-x]

于 2013-07-10T17:43:19.160 回答
-1

在您的正则表达式中转义具有特殊含义的字符。如果您不确定并且它不是字母字符,那么逃避它通常也没有什么坏处。

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

/^[\d\-,\.\+\(\) ]*$/
于 2013-07-10T17:30:25.020 回答