Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多模式字符串拆分_Java_Regex - Fatal编程技术网

Java 多模式字符串拆分

Java 多模式字符串拆分,java,regex,Java,Regex,我有一个文本,由不同的正则表达式分隔符组成,后跟文本。 在本例中,我有3个正则表达式分隔符(PatternA、B、C),文本如下所示: |…字符串匹配A..文本1..字符串匹配B..文本2..字符串匹配A..文本3..字符串匹配C..文本4| 我正在寻找一种高效的Java解决方案,将信息提取为三元组列表: {PatternA,StringMatchingA,Text1} {PatternB,StringMatchingB,Text2} {PatternA,StringMatchingA,Tex

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

|…字符串匹配A..文本1..字符串匹配B..文本2..字符串匹配A..文本3..字符串匹配C..文本4|

我正在寻找一种高效的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...  
   }
备注:

  • 模式是相互排斥的
  • 字符串始终以至少一个模式开头

您可以使用循环,在代码块中,您可以“吃”文本开头的内容。 这样,每次迭代解析都非常简单,并且可以维护/扩展

简单的规则是:吃你发现的东西,然后处理它

像这样的

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

    chunk = eat(text,pattern1);
    if (chunk.lengh()>0}{
       ...
       continue;
    }
    chunk = eat(text,pattern2);
    if (chunk.lengh()>0}{
       ...
       continue;
    }
 }
出于性能原因,您必须在进入循环之前编译regexp模式


(也可以考虑使用类似的解析器生成器)。

如果原始效率是您最关心的问题,那么您可能会发现自定义解析器可以获得更好的性能(一次读取一个字符,直到它碰到分隔符,然后返回一个标记)。否则,我唯一能建议的是,如果您经常调用
split(Pattern)
,那么就使用
private static final Pattern
,因为
String.split(String)
每次调用时都会创建一个新的
Pattern
对象,这在循环中代价很高。如果您不知道字符串中每个标记的出现顺序,然后将所有这些元素交替放置是通常的解决方案
((PatternA)|(PatternB)|(PatternC))
。然而,不清楚这些模式是否是互斥的,或者是否存在两个模式可以匹配的字符串。也不清楚你是否希望在某个位置上没有任何模式匹配时发生“碰撞”;我们可以假设字符串以给定的模式之一开始。