我正在为一个项目过滤SSN#。产品的SSN默认表达式为
(^|\b)(?!9|8|77[3-9]|666|000)(\d{3})( - | |-)(?!00)(\d{2})\3(?!0000)(\d{4})(\b|$)
在过去,他们使用regex表达式对自定义脚本进行了修改:
(^|\b)(?!9|8|77[3-9]|666|000)(\d{3})( - | |-)(?!00)(\d{2})\3(?!0000)(\d{4})($|[^\d-])
这两个表达式之间的区别是
(\b|$)
\b: backspace
$:end of string
和
($|[^\d-])
$:end of string
[^]: Not in position
\d-: not match 0-9
我想这对我来说没有任何意义。为什么要做这样的改变?这两个表达式的结尾似乎都是多余的。任何帮助都将不胜感激。谢谢!!
发布于 2013-04-19 00:24:31
这里的区别是:
(\b|$)
vs
($|[^\d-])
\b
仅表示字符类中的退格符,如[\babc]
将匹配'a‘、'b’、'c‘或退格符。在字符类之外,它是一个分词符,例如字母和空格之间的。
以前,正则表达式可以接受SSN,匹配到这一点的模式,以字符串结尾($
)或任何断字符(\b
)结束。因此它将匹配"111-22-3333“或"111-22-3333垃圾数据”中的SSN
在更改之后,它通常对SSN后面的内容更加宽松。它可以以字符串结尾($
)或除数字或连字符([^\d-]
)以外的任何字符结尾。因此,除了上面匹配的内容之外,它还将匹配“111-22-3333垃圾”或"111-22-3333#6789“中的SSN,但不匹配"111-22-33333”或"111-22-3333-123“中的SSN
坦率地说,在我看来,您列出的旧版本在大多数情况下似乎更正确,但这当然取决于您的应用程序的需求。
https://stackoverflow.com/questions/16087852
复制相似问题