正则表达式查找方法
这是我在给定字符串中查找"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
类的源代码 。
正如您可以在find()
的文档中阅读:
尝试查找与模式匹配的输入序列的下一个子序列。
此方法从此匹配器区域的开头开始,或者,如果方法的先前调用成功且匹配器尚未重置,则在第一个与上一个匹配不匹配的字符处开始。
如果匹配成功,则可以通过start,end和group方法获得更多信息。
所以当你第一次调用matcher(String text)
时没有任何反应 。 只有当你调用find()
时,它才会找到第一个匹配。 如果你第二次调用find()
,它的目标是找到下一个匹配,依此类推。
以下序列图描述了发生的情况:
构造匹配器,每次调用find()
,“光标”移动到下一个匹配。
更新:
-
find()
尝试查找与模式匹配的子字符串。 -
start()
返回子串匹配的位置。 - 如果整个字符串与给定模式匹配,则
matches
返回true。