字符串检查 - 大型模式集 - java

时间:2014-03-27 10:11:12

标签: java regex performance

我需要检查一个输入字符串,它可以匹配Java中的一个或多个模式..

我尝试使用if - else检查匹配的值..但我有超过100个检查 做这样的if-else也不是好的方法..

同样循环遍历每个字符串并检查输入字符串可能非常密集。

是否有一种简单的方法,其表现也很好。

样本值低于(有近100多种此类模式)

如果我输入IP | VAR | D00 | PB | TM | AB,我应该得到3个模式匹配... 我需要选择每个模式的值......

IP|VAR|**                         - IPVAR
IP|VAR|D00|*                      - IPVARD00
IP|VAR|D00|PB|*                     - IPVARE 
IP|ANBT|D00|*                     - IPVARAD
IK|**|ServiceApp or IK|**|Ser|    - IKSER

2 个答案:

答案 0 :(得分:0)

你的意思是这样的:

档案:patterns

tucky*
Fried
Chi*
Unix
Apple
Nikon

档案:words

Kentucky Fried Chicken
Nikon

然后像这样搜索:

grep -f patterns words
Kentucky Fried Chicken
Nikon

-o

grep -o -f patterns words
tucky
Fried
Chi
Nikon

答案 1 :(得分:0)

循环是要走的路:如果你真的需要检查那么多模式,那么除了在循环中尝试它们之外,你无法做很多事情。

如果您的所有模式都以两个固定字母开头,则此处应用一个简单的优化:按前两个字母对所有模式进行分组,然后检查传入字符串的前两个字母,并选择基于的模式组它。例如,如果字符串的前两个字母是'I''P',那么您应该仅循环以"IP|"开头的模式,并跳过剩余的模式。

通过前两个字符组织模式的一种方法是使用Map

Map<String,List<MyPattern>> patterns = ...

现在你可以这样做:

List<MyPattern> applicablePatterns = patterns.get(inputString.substring(0, 2));
for (MyPattern p : applicablePatterns) {
    // This loop is much shorter
}