2015-02-08 15 views
0

我有一個字符串必須提取多個子字符串。將被提取的字符串在'之間。如何在Java中提取多引號子字符串

我只能提取第一個或最後一個,當我使用indexOf或正則表達式。

我怎樣才能提取它們,並將它們放入數組或列表中,而無需解析相同的字符串?

resultData = "Error 205: 'x' data is not crawled yet. Check 'y' and 'z' data and update dataset 't'"; 

我在下面試過;

protected static String errorsTPrinted(String errStr, int errCode) { 

if (errCode== 202) { 

ArrayList<String> ar = new ArrayList<String>(); 
Pattern p = Pattern.compile("'(.*?)'"); 
Matcher m = p.matcher(errStr); 
String text; 

for (int i = 0; i < errStr.length(); i++) { 

m.find(); 
text = m.group(1); 
ar.add(text); 
} 

return errStr = "Err 202: " + ar.get(0) + " ... " + ar.get(1) + " ..." + ar.get(2) + " ... " + ar.get(3); 
} 

編輯

我用@MinecraftShamrock的做法。

if (errCode== 202) { 
List<String> getQuotet = getQuotet(errStr, '\''); 
return errStr = "Err 202: " + getQuotet.get(0) + " ... " + getQuotet.get(1) + " ..." + getQuotet.get(2) + " ... " + getQuotet.get(3); 
} 
+0

這應該不是那麼複雜。你能發表一些你已經嘗試過的東西,並感到沮喪到最後在這裏跑步嗎? – 2015-02-08 10:10:21

+1

''(。*?)''就是你想要的。我不會告訴你完整的解決方案,首先嚐試自己,並讓我們知道你是否有問題。 – Maroun 2015-02-08 10:10:26

+0

@MarounMaroun我已經嘗試過了,結果只有'x',y,z,t結果消失。 – 2015-02-08 10:20:27

回答

1

你可以使用這個非常簡單的算法,這樣做,避免正則表達式(因爲不能100%確定它的複雜性):

public List<String> getQuotet(final String input, final char quote) { 
    final ArrayList<String> result = new ArrayList<>(); 
    int n = -1; 
    for(int i = 0; i < input.length(); i++) { 
     if(input.charAt(i) == quote) { 
      if(n == -1) { //not currently inside quote -> start new quote 
       n = i + 1; 
      } else { //close current quote 
       result.add(input.substring(n, i)); 
       n = -1; 
      } 
     } 
    } 
    return result; 
} 

這適用於任何期望的「電子字符,運行時複雜度爲O(n)。如果字符串以公開報價結尾,則不會包含該字符串。但是,這可以很容易地添加。

我認爲這比正則表達式更可取,因爲你可以絕對確定它的複雜性。此外,它可以與最少的庫類一起工作。如果您關心大投入的效率,請使用它。

最後但並非最不重要的是,它完全不關心兩個引號字符之間的內容,因此它可以處理任何輸入字符串。

+0

這是一個非常好的方法。我正在解析一個json錯誤代碼,並簡單地改變它的語言。不太熟悉json文本中的變量解析,因此我正在解析它的子字符串並重新編寫錯誤。我更好地使用它,謝謝。 – 2015-02-08 10:45:48

1

只需使用模式:

'([^']++)' 

而一個Matcher像這樣:

final Pattern pattern = Pattern.compile("'([^']++)'"); 
final Matcher matcher = pattern.matcher(resultData); 
while (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

這個循環遍歷String並打印每場比賽。

輸出:

x 
y 
z 
t 
1

這裏有一個簡單的方法(假設沒有逃脫字符等):

// Compile a pattern to find the wanted strings 
Pattern p = Pattern.compile("'([^']+)'"); 
// Create a matcher for given input 
Matcher m = p.matcher(resultData); 
// A list to put the found strings into 
List<String> list = new ArrayList<String>(); 
// Loop over all occurrences 
while(m.find()) { 
    // Retrieve the matched text 
    String text = m.group(1); 
    // Do something with the text, e.g. add it to a List 
    list.add(text); 
} 
相關問題