Java Regex停止捕获重复标记

Java Regex停止捕获重复标记,java,regex,Java,Regex,我在捕获基于标签(多个单词)读取前后的SSN时遇到问题。该字段为freetext,用户可以以任何格式输入SSN。在下面的输入中,我有两种不同的格式XXX-XXX-XXX和XX-XXXXXXX 输入字符串: Hi i'm John my SSN is 111-111-111, then my wife 222-222-222 might be SocialNumber and my daughter SSN :: 12.3456789 and son SSN will be 33-4444444

我在捕获基于标签(多个单词)读取前后的SSN时遇到问题。该字段为freetext,用户可以以任何格式输入SSN。在下面的输入中,我有两种不同的格式XXX-XXX-XXX和XX-XXXXXXX

输入字符串:

Hi i'm John my SSN is 111-111-111, then my wife 222-222-222 might be SocialNumber and my daughter SSN :: 12.3456789 and son SSN will be 33-4444444 
标签:SSN,社会号码

正则表达式:

    String pattern = "(SSN|SocialNumber)([^\\d]*)(\\d{3}[.-]\\d{3}[.-]\\d{3})|"
                    +"(\\d{3}[.-]\\d{3}[.-]\\d{3})([^\\d]*)(SSN|SocialNumber) | " 
                    +"(SSN|SocialNumber)[^\\d]*(\\d{2}[.-]\\d{6})|"
                    + "(\\d{2}[.-]\\d{6})([^\\d]*(SSN|SocialNumber))";
代码输出:

SSN is 111-111-111
222-222-222 might be SocialNumber and my daughter SSN 
 SSN will be 33-444444
如果您看到上面的输出,它会根据标签(SSN | SocialNumber)正确地捕获John、他的妻子和儿子的SSN,但丢失了女儿的SSN。请协助

预期产出:

SSN is 111-111-111
222-222-222 might be SocialNumber
SSN :: 12.3456789
SSN will be 33-4444444
请尝试以下正则表达式:

SSN is | is SocialNumber|\d{3}-\d{3}-\d{3}|\d{2}-\d{7}|\d{2}\.\d{7}
  • 我基本上取了两个字符串:
    SSN是
    是SocialNumber
  • 和3种格式:
    ddd-ddd-ddd-ddd-ddd-ddd-ddd-ddd-ddd-ddd
测试。

尝试下面的正则表达式:

SSN is | is SocialNumber|\d{3}-\d{3}-\d{3}|\d{2}-\d{7}|\d{2}\.\d{7}
  • 我基本上取了两个字符串:
    SSN是
    是SocialNumber
  • 和3种格式:
    ddd-ddd-ddd-ddd-ddd-ddd-ddd-ddd-ddd-ddd

测试。

是否不使用正则表达式?正则表达式擅长解析(一种定义非常明确的类型)。因此,如果您确实需要处理自由形式的输入和未知的单词距离,请编写一个实际的解析器:标记您的输入并为其编制索引,将每个可能散布在SSN中的有效符号标记为评估目标,然后查找它是否有“描述SSN的单词”在它们附近。前后匹配的规则是什么?不要使用正则表达式?正则表达式擅长解析(一种定义非常明确的类型)。因此,如果您确实需要处理自由形式的输入和未知的单词距离,请编写一个实际的解析器:标记您的输入并为其编制索引,将每个可能散布在SSN中的有效符号标记为评估目标,然后查找它是否有“描述SSN的单词”在它们附近。什么是前后匹配的规则?@Homer,我们无法预测after/before标签这个词。它可以是任何东西。因此,我捕获了标记前后的数字。“字段是freetext用户可以以任何格式输入SSN”表明SSN本身唯一可能的定义是
[\d\W]{9}
,之后您还需要做额外的工作:op想要的并不是regex发明的目的。@Homer,我们无法预测标签后面/前面的单词。它可以是任何东西。因此,我捕获了标记前后的数字。“字段是freetext用户可以以任何格式输入SSN”表明SSN本身唯一可能的定义是
[\d\W]{9}
,之后您仍然需要做额外的工作:op想要的不是regex发明的目的。