2017-02-15 56 views
2

我有一個形式爲"Some lengthy string, Pattern1: string1, Pattern2: string2, Pattern3: string3"的字符串。我的目標是從這樣的String中提取string1string2string3拆分字符串多個模式

請注意,Strings,Pattern1Pattern2Pattern3本身由多個字符組成。我知道解決方案,如果這些模式是單個字符。目前我被迫分別撥打String.split()撥打Pattern1Pattern2Pattern3

有沒有更優雅的做法呢?或者有沒有逃脫多個split()電話?

編輯:我正在尋找或Java特定的解決方案(因此Java在標題中,但它被編輯出)。任何方式。這是我嘗試過的,它似乎對我有用。這

String someString = "Some lengthy string Pattern1: string1 Pattern2: string2 Pattern3: string3"; 
String [] str = someString.split("Pattern1:|Pattern2:|Pattern3:"); 
System.out.println(str[1]); 
System.out.println(str[2]); 
System.out.println(str[3]); 

輸出是

string1 
string2 
string3 

任何明顯的問題呢?

+5

捕獲組可以幫助:['樣式1(S):(。*?)\ S * \ S *模式2:\ S *(。*?),\ s * Pattern3:\ s *(。*)「'](https://regex101.com/r/LA4cts/2) –

回答

0

怎麼樣一個String.replaceAll()而不是捕獲組?

str.replaceAll(".*(?:Pattern1: ([^,]*))(?:, Pattern2: ([^,]*))(?:, Pattern3: ([^,]*))", "$1;$2;$3").split(";"); 

或使其更短,你可以刪除的模式和只認準冒號:

str.replaceAll("[^:]*: ([^,]*,?)", "$1").split(","); 
+0

我喜歡這個,但是考慮改成:'。 ..「$ 1; $ 2; $ 3」)。split(「;」)'獲得一個數組而不是一個連續字符串 – Bohemian

+0

已修改。謝謝! – Uniphonic

1

要了解您的對象的數組,您必須首先剝離了主導作用,然後分裂的其它圖案:

String targets = input.replaceAll("^.*?Pattern1: ", "").split(", (Pattern2|Pattern3): "); 
0

字符串stringToSearch = 「一些冗長串樣式1:字符串1 PATTERN2:字符串2 Pattern3:STRING3」;

String REGEX = "Pattern\\w:\\s[\\w]+"; 
Pattern p1 = Pattern.compile(REGEX); 
Matcher m = p1.matcher(stringToSearch); 

Pattern p2 = Pattern.compile(":"); 

while (m.find()) 
{ 
    String[] items = p2.split(m.group()); 
    if(items.length < 2) 
     break; 
    System.out.println(items[1]); 
} 

輸出:

字符串1 字符串2 STRING3