从文本中提取客户唯一ID

时间:2015-01-10 15:50:02

标签: regex regex-negation pattern-recognition

我需要提取客户ID,这些ID是文本中唯一的字母数字字符序列。它们可以包含仅数字或数字和字母字符或仅包含字母字符。我们可以假设它们超过5个字符。他们可能会被资本化或不资本化。

我想过使用字典,如果字符序列不是字典中的单词而且字符序列长于5,那么它就是一个很好的候选字符。

任何想法或示例Java代码都会有所帮助。感谢

1 个答案:

答案 0 :(得分:1)

这是一个简单的正则表达式,它将匹配6个或更多字符的字母数字序列:

(?<![A-Za-z0-9])[A-Za-z0-9]{6,}

我在这里使用了负面的lookbehind而不是单词边界(\b),以防你的文字中有下划线。如果你的正则表达式没有外观,那么你会想要使用单词边界代替(但我现在注意到你在你的问题中提到了java - 而java确实有后看)。

如果客户ID必须包含数字,那么匹配这些数字的正则表达式将如下所示:

(?<![A-Za-z0-9])(?=[A-Za-z]*[0-9][A-Za-z0-9]*)[A-Za-z0-9]{6,}

请参阅Regex101 demo

您的客户ID可以有多长时间?如果是这样,那么设置这个限制可能会有所帮助 - 任何字母数字字符序列更长比这个数字显然不会成为匹配。例如,如果限制为25个字符,则正则表达式将如下所示:

(?<![A-Za-z0-9])(?=[A-Za-z]*[0-9][A-Za-z0-9]*)[A-Za-z0-9]{6,25}(?![A-Za-z0-9])

(我在最后添加了前瞻,否则这可能只是匹配长字母数字序列的前25个字符!)

一旦从文本中提取了匹配项,就可以进行字典查找。我知道StackOverflow在这个问题上有问题和答案。

要在Java中实际使用此正则表达式,您将使用PatternMatcher类。例如,

String mypattern = "(?<![A-Za-z0-9])(?=[A-Za-z]*[0-9][A-Za-z0-9]*)[A-Za-z0-9]{6,25}(?![A-Za-z0-9])";
Pattern tomatch = Pattern.compile(mypattern);

等。希望这会有所帮助。

<强>更新

这只是发生在我身上,而不是尝试字典匹配,最好将提取的值存储在数据库表中,然后将其与您的customers表进行比较。