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...
}
備註:
- 模式是互斥的。
- 字符串總是以至少一個模式開始。
如果原始效率是您主要關心的問題,那麼您可能會發現自定義解析器可以獲得更好的性能(一次讀取一個字符,直到碰到分隔符,然後返回一個令牌)。否則,我建議的唯一的事情是,如果經常調用split(pattern),則使用'private static final Pattern',因爲'String.split(String)'每次調用時都會創建一個新的'Pattern'對象,這在循環中是昂貴的。 – Bobulous
如果您不知道字符串中每個標記的出現順序,那麼將它們全部交替進行是通常的解決方案'((PatternA)|(PatternB)|(PatternC))''。但是,這些模式是否互相排斥,或者是否存在兩個可匹配的字符串尚不清楚。當某個位置沒有任何模式匹配時,是否希望發生「碰撞」現象也不清楚。 – nhahtdh
我剛剛編輯帖子:模式是互斥的;我們可以假設字符串以給定模式之一開始。 – David