我正在尝试从字符串中打印出一个模式。
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);
这样做的方法。我想以不同的方式做到这一点。
答案 0 :(得分:1)
以下是您要求的示例:
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));
}
由于您确实想要使用\\s
而不是空白,因此它还会匹配Hello\tWorld
,Hello\nWorld
以及Hello和World之间所有其他可能的单个空白字符。
我写它的方式只打印第一个找到的匹配(如果有的话),如果你想打印所有匹配到你的模式,用if
替换while
。
但如果我不需要,我不会使用start()
,end()
和substring()
,如果你想打印你的比赛,你可以打印matcher.group()
答案 1 :(得分: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;
}
请注意,这会给出最后一次匹配。如果我们有一些匹配,我们需要使用循环