2012-12-13 157 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; 
    } 

注意,这给最后一个匹配。如果我们有一些匹配,我们需要使用循环

相关问题