0

我正在为一个项目过滤掉 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

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

4

1 回答 1

0

这里的区别:

(\b|$)

对比

($|[^\d-])

\b仅表示字符类中的退格字符,例如[\babc]匹配“a”、“b”、“c”或退格字符。在字符类之外,也就是在这里看到的,它是一个分词符,例如字母和空格之间的 a。

以前,正则表达式可以接受 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"

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

于 2013-04-18T16:24:30.867 回答