Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式未编译-无匹配可用错误_Java_Regex - Fatal编程技术网

Java正则表达式未编译-无匹配可用错误

Java正则表达式未编译-无匹配可用错误,java,regex,Java,Regex,我一直在从事这个项目,它需要将文件转换为字符串,然后在字符串中查找某些字符串的位置。我正在尝试使用模式和匹配器类来实现这一点。请看我下面的代码(java): 其中j是for循环中的一个变量(从1开始,一直到24),而input是一个字符串,其开始如下所示: 第一轮抛投1)。。。掷骰子2)。。。掷骰子3)。。。掷骰子4) 我需要使用正则表达式,因为这个字符串经常会在掷骰和数字之间有一个\n(而不是一个简单的空格) 我对regex还不熟悉,试图从互联网上学习我能学到的东西,但我不明白为什么这个程序不

我一直在从事这个项目,它需要将文件转换为字符串,然后在字符串中查找某些字符串的位置。我正在尝试使用模式和匹配器类来实现这一点。请看我下面的代码(java):

其中j是for循环中的一个变量(从1开始,一直到24),而input是一个字符串,其开始如下所示:

第一轮抛投1)。。。掷骰子2)。。。掷骰子3)。。。掷骰子4)

我需要使用正则表达式,因为这个字符串经常会在掷骰和数字之间有一个\n(而不是一个简单的空格)

我对regex还不熟悉,试图从互联网上学习我能学到的东西,但我不明白为什么这个程序不能编译。eclipse给我的错误是:

Exception in thread "main" java.lang.IllegalStateException: No match available 
at java.util.regex.Matcher.start 
at Driver.main
如果您能帮助修复正则表达式,我们将不胜感激。如果有其他人对这个问题有其他的解决办法,请告诉我。谢谢

首先调用
matches()
函数,然后再尝试从matcher对象获取任何内容。调用
matches()
将触发匹配,并根据是否存在匹配返回一个布尔值

... // as usual
int beginPosition = -1;
int endPosition = -1;
if(beginMatcher.matches()) {
     beginPosition = beginMatcher.start();
} 

if(endMatcher.matches()) {
    endPosition = endMatcher.start();
}

正如@MikeSamuel在评论中指出的,如果您只想要第一个匹配,那么
.find()
可能会更好。另外,考虑将<代码> \b>代码>添加到正则表达式的末尾,例如<代码> tosUp 1 未在<代码> toSUPSUP 10 <代码>中找到。例如,

在调用之前,必须调用<代码>匹配()/<代码>或<代码>查找())>代码>。Javadoc甚至记录了这一点:如果还没有尝试匹配,或者之前的匹配操作失败,则抛出
IllegalStateException
。Javadoc of说:一旦创建,匹配器就可以用来执行三种不同的匹配操作:
匹配
方法[…]
查找
方法[…]查找方法[…]。*即使这样做,我仍然会得到相同的错误。我使用了find方法。它们是否返回
true
,表示匹配成功?在成功执行匹配之前,不能请求匹配结果值。有道理,对吧这就像要一个苹果,被告知没有,然后问它们有多大。这是一个无法回答的问题,这就是为什么会出现异常。请稍候,在使用“查找”后,它开始部分工作(不会遍历所有字符串,但在一段时间后仍会找到相同的错误,但对其中一些错误有效)。让我看一下,试着理解它为什么会停在原来的位置,我会给你回复的。经过一些快速的修改,看起来它工作了
.matches()
匹配整个字符串。也许
find()
会更好,不过在这种情况下,您可能需要在数字后面加一个
\b
,以便在
TOSS-UP 10
中找不到
TOSS-UP 1
... // as usual
int beginPosition = -1;
int endPosition = -1;
if(beginMatcher.matches()) {
     beginPosition = beginMatcher.start();
} 

if(endMatcher.matches()) {
    endPosition = endMatcher.start();
}