2015-06-14 21 views
4

我有一個文本,由不同的正則表達式分隔符組成,後面跟着文本。 在這個例子中,我有3個正則表達式分隔符(PatternA,B,C),文本如下所示:多圖案字符串分割

| ..StringMatchingA .. | ..Text1 .. | ..StringMatchingB .. | ..文本2 .. | ..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... 
    } 

備註:

  • 模式是互斥的。
  • 字符串總是以至少一個模式開始。
+0

如果原始效率是您主要關心的問題,那麼您可能會發現自定義解析器可以獲得更好的性能(一次讀取一個字符,直到碰到分隔符,然後返回一個令牌)。否則,我建議的唯一的事情是,如果經常調用split(pattern),則使用'private static final Pattern',因爲'String.split(String)'每次調用時都會創建一個新的'Pattern'對象,這在循環中是昂貴的。 – Bobulous

+0

如果您不知道字符串中每個標記的出現順序,那麼將它們全部交替進行是通常的解決方案'((PatternA)|(PatternB)|(PatternC))''。但是,這些模式是否互相排斥,或者是否存在兩個可匹配的字符串尚不清楚。當某個位置沒有任何模式匹配時,是否希望發生「碰撞」現象也不清楚。 – nhahtdh

+0

我剛剛編輯帖子:模式是互斥的;我們可以假設字符串以給定模式之一開始。 – David

回答

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)。