我一直在研究这个项目,它需要将文件转换为字符串,然后在字符串中查找某些字符串的位置。我正在尝试使用Pattern和Matcher类来执行此操作。请看下面的代码(java):
String begin = "TOSS-UP" + "\\s*" + j;
String end = "TOSS-UP" + "\\s*" + (j+1);
Pattern beginPattern = Pattern.compile(begin);
Pattern endPattern = Pattern.compile(end);
System.out.println(beginPattern);
Matcher beginMatcher = beginPattern.matcher(input);
Matcher endMatcher = endPattern.matcher(input);
int beginPosition = beginMatcher.start();
int endPosition = endMatcher.start();
其中j是for循环中的变量(从1开始并最多可达24)并且输入是一个以这样开头的字符串:
ROUND 1 TOSS-UP 1)...... TOSS-UP 2)...... TOSS-UP 3)...... TOSS-UP 4)......
我需要使用正则表达式,因为每次经常这个字符串在TOSS-UP和数字之间都有\ n(而不是简单的空格)。
我是正则表达式的新手,试图了解我可以通过互联网上的示例,我无法理解为什么这个程序无法编译。日食给我的错误是:
Exception in thread "main" java.lang.IllegalStateException: No match available
at java.util.regex.Matcher.start
at Driver.main
任何帮助修复正则表达式将不胜感激。如果其他人有另一个问题的解决方案,请告诉我。谢谢!
答案 0 :(得分:1)
在尝试从匹配器对象获取任何内容之前,先调用matches()
函数。调用matches()
将触发匹配,并根据是否存在匹配返回布尔值。
... // as usual
int beginPosition = -1;
int endPosition = -1;
if(beginMatcher.matches()) {
beginPosition = beginMatcher.start();
}
if(endMatcher.matches()) {
endPosition = endMatcher.start();
}
正如@MikeSamuel在评论中指出的那样,如果你只想要第一场比赛,或许.find()
会更好。另外,请考虑在正则表达式的末尾添加\b
,以便在TOSS-UP 1
中找不到TOSS-UP 10
。