正则表达式查找方法

这是我在给定字符串中查找"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() ,“光标”移动到下一个匹配。

更新:

  1. find()尝试查找与模式匹配的子字符串。
  2. start()返回子串匹配的位置。
  3. 如果整个字符串与给定模式匹配,则matches返回true。