我需要提取客户ID,这些ID是文本中唯一的字母数字字符序列。它们可以包含仅数字或数字和字母字符或仅包含字母字符。我们可以假设它们超过5个字符。他们可能会被资本化或不资本化。
我想过使用字典,如果字符序列不是字典中的单词而且字符序列长于5,那么它就是一个很好的候选字符。
任何想法或示例Java代码都会有所帮助。感谢
答案 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中实际使用此正则表达式,您将使用Pattern
和Matcher
类。例如,
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表进行比较。