多模式字符串拆分

时间:2015-06-14 17:13:55

标签: java regex

我有一个文本,由不同的正则表达式分隔符组成,后跟文本。 在这个例子中,我有3个正则表达式分隔符(PatternA,B,C),文本如下所示:

| ..StringMatchingA .. | ..Text1 .. | ..StringMatchingB .. | ..Text2 .. | ..StringMatchingA .. | ..Text3 .. | ..StringMatchingC .. | ..Text4。 。|

我正在寻找一种有效的Java解决方案来提取信息作为三元组列表:

  • {PatternA, StringMatchingA, Text1}
  • {PatternB, StringMatchingB, Text2}
  • {PatternA, StringMatchingA, Text3}
  • {PatternC, StringMatchingC, Text4}

有了这些信息,我知道每个三元组,匹配的模式是什么,以及匹配它的字符串。

目前,我有这种方法,但我想我可以使用高级正则表达式使用更有效的方法吗?

   String pattern = "?=(PatternA|PatternB|PatternC)";
   String()[] tokens = input.split(pattern);
   for(String token : tokens)
   {
      //if start of token matches patternA ...
      //elseif start of token matches pattern B...
      //etc...  
   }

备注:

  • 模式是互斥的。
  • 字符串始终以至少一种模式开头。

1 个答案:

答案 0 :(得分:0)

您可以使用循环并在代码块内部“吃掉”您在文本开头找到的内容。 通过这种方式,在每次迭代时,解析都非常简单且可维护/可扩展。

简单的规则是:吃你发现的东西并处理它。

像这样的东西

String chunk;
while(text.size() >0 {

    chunk = eat(text,pattern1);
    if (chunk.lengh()>0}{
       ...
       continue;
    }
    chunk = eat(text,pattern2);
    if (chunk.lengh()>0}{
       ...
       continue;
    }
 }

出于性能原因,你必须在进入循环之前编译正则表达式模式。

(考虑使用像ANTLR这样的解析器生成器。)