我正在过滤SSN#的项目。产品的SSN默认表达式是
(^|\b)(?!9|8|77[3-9]|666|000)(\d{3})( - | |-)(?!00)(\d{2})\3(?!0000)(\d{4})(\b|$)
过去对其带有正则表达式的自定义脚本进行了修改:
(^|\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
我想这对我没有意义。为什么要做出改变?这些表达式的两个结尾似乎都是多余的。非常感激任何的帮助。 谢谢!
答案 0 :(得分:0)
区别在于:
(\b|$)
VS
($|[^\d-])
\b
仅表示字符类中的退格字符,如[\babc]
匹配'a','b','c'或退格字符。在字符类之外,这是在这里看到的,它是一个单词分隔符,例如字母和空格之间。
以前,正则表达式可以接受SSN,将模式与该点匹配,以字符串结尾($
)或任何分词符(\b
)结束。因此它将匹配“111-22-3333”或“111-22-3333垃圾数据”中的SSN
在改变之后,它通常对SSN之后的内容更加宽容。它可以以字符串($
)的结尾或除数字或连字符([^\d-]
)之外的任何字符结尾。因此,除了上面匹配的内容之外,它还匹配“111-22-3333garbage”或“111-22-3333#6789”中的SSN,但不匹配“111-22-33333”或“111-22”中的SSN -3333-123"
坦率地说,你列出的旧版本对我来说似乎更适合大多数情况,但这当然取决于你的应用程序的需求。