将SSN与RegEx匹配

时间:2013-04-18 16:04:03

标签: regex

我正在过滤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

我想这对我没有意义。为什么要做出改变?这些表达式的两个结尾似乎都是多余的。非常感激任何的帮助。 谢谢!

1 个答案:

答案 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"

坦率地说,你列出的旧版本对我来说似乎更适合大多数情况,但这当然取决于你的应用程序的需求。