2017-04-05 129 views
1

這是我的代碼,在給定的字符串中查找"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

回答

4

find方法掃描輸入序列,查找與模式匹配的下一個子序列,並返回指示失敗成功的boolean

內部find方法調用search方法(訪問控制默認值),以便啓動搜索以在給定邊界內找到Pattern。在每場比賽中,邊界都會增加,直到找到所有的比賽。

Matcher類的後面,它是一個狀態機,它將保持匹配的狀態。

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

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

0

更新時間:

  1. find()試圖找到匹配模式的子字符串。
  2. start()返回子字符串匹配的位置。
  3. matches如果整個字符串與給定模式匹配,則返回true。
+0

沒有代碼只是答案,總是提供一個文本解釋。 –

+0

這是代碼示例。用戶可以根據需要更改輸入。測試過的代碼! –

+2

StackOverflow上的答案應該**回答問題**。這個代碼示例*與問題*無關,除了它使用find方法。它*不相關*。用戶詢問了「find」和「start」的內部工作情況。沒有關於懶惰/貪婪匹配的問題, – RealSkeptic

2

正如你可以閱讀in the documentation of find()

試圖發現 模式匹配的輸入序列的下一個子

該方法始於此匹配的區域的開始,或者,如果該方法的 以前的調用是成功的,並且匹配具有 不是因爲被複位,在不被 以前匹配所匹配的第一個字符。

如果匹配成功,則可以通過 開始,結束和組方法獲取更多信息。

所以,當你調用matcher(String text)在第一時間沒有任何反應。只有當你撥打find()時,它的目的是找到第一個匹配。如果您第二次撥打find(),它將着眼於找到下一場比賽等等。

以下序列圖描述會發生什麼:

sequence diagram of the code

匹配器被構造和每次find()被稱爲「光標」被移動到下一個匹配。