在与量词匹配失败后,Java的matcher.find()会保留什么样的状态?

在与量词匹配失败后,Java的matcher.find()会保留什么样的状态?,java,regex,matcher,Java,Regex,Matcher,在下文中,我希望第二次发现能够成功,但事实并非如此。为什么? 如果将量词从第一个正则表达式中删除,变成简单的asdf,则第二个匹配成功。查看Matcher对象会发现在第一次不成功的查找之后存储了某种组信息,尽管我没有预料到这一点。如果没有以前的匹配,则从开始处开始查找,或者从上次成功匹配的索引处开始查找。UsePattern是为了保留匹配器在输入中的位置,并丢弃我没有明确使用的组信息 我错过了一些东西,但我不知道是什么。我怀疑我必须通过查找和更新区域来实现这一点,例如,但我不知道为什么这种方法

在下文中,我希望第二次发现能够成功,但事实并非如此。为什么?

如果将量词从第一个正则表达式中删除,变成简单的asdf,则第二个匹配成功。查看Matcher对象会发现在第一次不成功的查找之后存储了某种组信息,尽管我没有预料到这一点。如果没有以前的匹配,则从开始处开始查找,或者从上次成功匹配的索引处开始查找。UsePattern是为了保留匹配器在输入中的位置,并丢弃我没有明确使用的组信息


我错过了一些东西,但我不知道是什么。我怀疑我必须通过查找和更新区域来实现这一点,例如,但我不知道为什么这种方法不起作用。

您的第一个正则表达式消耗整个字符串\\\\s*。当第二个正则表达式运行时,没有什么可以匹配的了


如果调用matcher.reset,它将按预期工作。

第一个正则表达式将使用整个字符串\\\\s*。当第二个正则表达式运行时,没有什么可以匹配的了


如果您调用matcher.reset,它将按预期工作。

看起来文档有点误导,或者实际上,它没有指定在调用find after failure时的行为

我假设预期的用法是在失败之前反复调用find,但在失败之后不重置find

查看可确认Matcher有一个索引字段,在执行下一次“查找”时,它最后从该字段开始搜索,当查找失败时,该索引将前进到末尾,并且不会重置


reset重置该索引,usePattern不会。看起来文档有点误导,或者实际上,它没有指定调用find after failure时的行为

我假设预期的用法是在失败之前反复调用find,但在失败之后不重置find

查看可确认Matcher有一个索引字段,在执行下一次“查找”时,它最后从该字段开始搜索,当查找失败时,该索引将前进到末尾,并且不会重置


重置重置该索引,而usePattern不会重置该索引。

好的,仔细重读后会发现匹配器在其输入的一个子集(称为区域)中找到匹配项。默认情况下,区域包含匹配器的所有输入。据我所知,文档中只定义了region方法来修改区域,尽管很明显,该区域在其他时间会被修改,因此会产生混淆。那么,find实际上修改了这个区域?好吧,仔细地重读一下,就会发现匹配器在其输入的一个子集(称为区域)中找到匹配项。默认情况下,区域包含匹配器的所有输入。据我所知,文档中只定义了region方法来修改区域,尽管很明显,该区域在其他时间会被修改,因此会产生混淆。那么,find实际上修改了区域?在我的实现中,我使用matcher在递归调用中维护状态,所以为了解决我的原始问题,我保存旧区域并调用regionoldStart,oldEnd,它在设置边界之前重置matcher。区域与内部“last”字段不同。您可以测试它:调用find不会更改区域。在我的实现中,我使用matcher在递归调用中维护状态,因此为了解决我的原始问题,我保存旧区域并调用regionoldStart,oldEnd,在设置边界之前重置matcher。区域与内部“last”字段不同。您可以测试它:调用find不会改变区域。
Matcher matcher = 
    Pattern.compile("\\s*asdf").matcher("apple banana cookie");

// returns false as expected
matcher.find();

// resets groups (that weren't being explicitly being used anyway), but not state.
matcher.usePattern(Pattern.compile("\\s*banana")); 

// returns false, expected true.
System.out.println(matcher.find());