正则表达式查找方法

问题描述:

这是我的代码,在给定的字符串中查找"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()内部工作。

+4

要理解内部工作,您应该阅读来源。但也许你想解释你期望看到什么,以及你不明白的是什么。 – RealSkeptic

+0

经典“阅读精美手册”的问题。 https://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#find() –

+0

@RealSkeptic恰到好处。你写了我在我的回答中添加的同样的建议:) – freedev

find方法扫描输入序列,查找与模式匹配的下一个子序列,并返回指示失败成功的boolean

内部find方法调用search方法(访问控制默认值),以便启动搜索以在给定边界内找到Pattern。在每场比赛中,边界都会增加,直到找到所有的比赛。

Matcher类的后面,它是一个状态机,它将保持匹配的状态。

另一方面,start方法返回由最新匹配捕获的子序列的起始索引作为int

如果你想真的更深入,我建议查看Matcher类的source code

更新时间:

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

没有代码只是答案,总是提供一个文本解释。 –

+0

这是代码示例。用户可以根据需要更改输入。测试过的代码! –

+2

StackOverflow上的答案应该**回答问题**。这个代码示例*与问题*无关,除了它使用find方法。它*不相关*。用户询问了“find”和“start”的内部工作情况。没有关于懒惰/贪婪匹配的问题, – RealSkeptic

正如你可以阅读in the documentation of find()

试图发现 模式匹配的输入序列的下一个子

该方法始于此匹配的区域的开始,或者,如果该方法的 以前的调用是成功的,并且匹配具有 不是因为被复位,在不被 以前匹配所匹配的第一个字符。

如果匹配成功,则可以通过 开始,结束和组方法获取更多信息。

所以,当你调用matcher(String text)在第一时间没有任何反应。只有当你拨打find()时,它的目的是找到第一个匹配。如果您第二次拨打find(),它将着眼于找到下一场比赛等等。

以下序列图描述会发生什么:

sequence diagram of the code

匹配器被构造和每次find()被称为“光标”被移动到下一个匹配。