Java 多模式字符串拆分
我有一个文本,由不同的正则表达式分隔符组成,后跟文本。 在本例中,我有3个正则表达式分隔符(PatternA、B、C),文本如下所示: |…字符串匹配A..文本1..字符串匹配B..文本2..字符串匹配A..文本3..字符串匹配C..文本4| 我正在寻找一种高效的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
{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))
。然而,不清楚这些模式是否是互斥的,或者是否存在两个模式可以匹配的字符串。也不清楚你是否希望在某个位置上没有任何模式匹配时发生“碰撞”;我们可以假设字符串以给定的模式之一开始。