2012-12-13 193 views
0

我試圖從字符串中打印出一個模式。在字符串中查找正則表達式

String stringToProcess = "Test Test Hello World Test Test"; 
String pattern = "Hello\\sWorld"; 
System.out.println(stringToProcess.substring(stringToProcess.indexOf(pattern), stringToProcess.lastIndexOf(pattern))); 

當我運行此代碼時,它似乎給出了很多錯誤,具體取決於我如何嘗試更改並修復它。由於它的正上方,它給人的錯誤:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1

請注意:我已經很清楚這樣做的Pattern.compile(regex, Pattern);方式。我想以不同的方式做到這一點。

+5

'indexOf()'不適用於正則表達式,參見[documentation](http://docs.oracle.com/javase/7/docs/api/ java/lang/String.html#indexOf(java.lang.String)) – jlordo

+0

有沒有辦法解決它? – ThreaT

+2

我知道的唯一的另一種方式是使用'Matcher.start()'....但涉及'Pattern.compile(正則表達式,模式)',你已經知道。 – NawaMan

回答

1

這是你要求的例子:東陽你真的想用\\s而不是空白的,它也將匹配Hello\tWorldHello\nWorld和你好與世界之間的所有其他可能的單個空格字符

String stringToProcess = "Test Test Hello World Test Test"; 
    String patternString = "Hello\\sWorld"; 
    Pattern pattern = Pattern.compile(patternString); 
    Matcher matcher = pattern.matcher(stringToProcess); 
    if (matcher.find()) { 
     int start = matcher.start(); 
     int end = matcher.end(); 
     System.out.println(stringToProcess.substring(start, end)); 
    } 

我寫它的方式只會打印找到的第一個匹配項(如果有的話),如果要打印所有匹配的圖案,請將if替換爲while

但我不會用start()end()substring()如果我沒有,你可以只打印matcher.group(),如果你要打印你的對手。

0

這是返回句子的開始位置功能:

public static int decodeString(String msg,String sentence) { 
     Pattern p = Pattern.compile("(.*)"+sentence+"(.*)"); 
     Matcher m = p.matcher(msg); 
     if (m.matches()) { 
      return m.end(1); 
     } 
     return -1; 
    } 

注意,這給最後一個匹配。如果我們有一些匹配,我們需要使用循環

相關問題