想要使用正则表达式替换返回所有匹配项

时间:2017-05-17 01:22:48

标签: .net regex vb.net

我想在vb.net中使用一个正则表达式,其中几个字符序列由交替字符|分隔。这些模式将由一个程序构建,用于查找机密数字序列和识别文本。我想找到输入中任何识别文本模式的所有匹配项。例如,使用这种模式:

\b(?i)(social security|credit card number|social security number|SSN)\b

这个输入文字:

  

社会保障案例社会保障号码426-54-3468。 (SSN:426-76-2456)我的SSN是:087-38-4646。社会安全号码087 40 6482.信用卡号码1222 2333 3444 4555我的SSN是:087-40-5434

找到"social security"的三个匹配项,一个用于"credit card number",两个用于"SSN"。我是否可以添加任何量词来匹配"Social Security Number""SOCIAL SECURITY NUMBER",或者是"social security number"之前编码"social security"的唯一方法?谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

问题是social security字符串是social security number的子字符串,前者在交替中排在第一位。如果您有... |social security number|social security| ...,那么较长时间会匹配,从而为您提供所需的输出。我怀疑有没有更简单的方法来实现与其他正则表达式功能相同(好吧,你可能尝试过类似social security(?!= number)的东西,但这对于任意字符串来说都很难实现。)

根据经验,当从任意字符串动态构建交替模式时,请按照它们的长度降序对这些字符串进行排序。

另一个方便的规则是引用可能在您构建模式的字符串中找到的任何正则表达式特殊字符。这可以使用Regex.Escape()完成。

因此,组成代码的模式可能如下所示:

Dim pattern = "\b(?i)(" _
    + String.Join("|",
        confidentialStrings _
            .OrderByDescending(Function(s) s.Length) _
            .[Select](Function(s) Regex.Escape(s))) _
    + ")\b"

VB.Net演示:https://dotnetfiddle.net/nOWrMb