正则表达式查找方法
这是我的代码,在给定的字符串中查找"ab"
模式。正则表达式查找方法
import java.util.regex.*;
public class RegExp
{
public static void main(String[] args)
{
Pattern p = Pattern.compile("ab");
Matcher m = p.matcher("ababbaba");
while(m.find())
{
System.out.println(m.start());
}
}
}
,但我无法理解的find()
和start()
内部工作。
find
方法扫描输入序列,查找与模式匹配的下一个子序列,并返回指示失败成功的boolean
。
内部find
方法调用search
方法(访问控制默认值),以便启动搜索以在给定边界内找到Pattern
。在每场比赛中,边界都会增加,直到找到所有的比赛。
在Matcher
类的后面,它是一个状态机,它将保持匹配的状态。
另一方面,start
方法返回由最新匹配捕获的子序列的起始索引作为int
。
如果你想真的更深入,我建议查看Matcher
类的source code。
更新时间:
-
find()
试图找到匹配模式的子字符串。 -
start()
返回子字符串匹配的位置。 -
matches
如果整个字符串与给定模式匹配,则返回true。
没有代码只是答案,总是提供一个文本解释。 –
这是代码示例。用户可以根据需要更改输入。测试过的代码! –
StackOverflow上的答案应该**回答问题**。这个代码示例*与问题*无关,除了它使用find方法。它*不相关*。用户询问了“find”和“start”的内部工作情况。没有关于懒惰/贪婪匹配的问题, – RealSkeptic
正如你可以阅读in the documentation of find()
:
试图发现 模式匹配的输入序列的下一个子。
该方法始于此匹配的区域的开始,或者,如果该方法的 以前的调用是成功的,并且匹配具有 不是因为被复位,在不被 以前匹配所匹配的第一个字符。
如果匹配成功,则可以通过 开始,结束和组方法获取更多信息。
所以,当你调用matcher(String text)
在第一时间没有任何反应。只有当你拨打find()
时,它的目的是找到第一个匹配。如果您第二次拨打find()
,它将着眼于找到下一场比赛等等。
以下序列图描述会发生什么:
匹配器被构造和每次find()
被称为“光标”被移动到下一个匹配。
要理解内部工作,您应该阅读来源。但也许你想解释你期望看到什么,以及你不明白的是什么。 – RealSkeptic
经典“阅读精美手册”的问题。 https://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#find() –
@RealSkeptic恰到好处。你写了我在我的回答中添加的同样的建议:) – freedev