正則表達式的貪婪模式有感

1. 總述

貪婪模式感覺就像,只要符合我當前的規則就一直匹配,纔不會去管正則表達式中我後面的限制規則

2. 例子

 static final Pattern CONTENT_PATTERN1 = Pattern.compile("_\\S*?==");
 static final Pattern CONTENT_PATTERN2 = Pattern.compile("_\\S*==");
    @Test
    public void splitContent1() {
        String content = "_123==_456==";
        List<String> contentList = new ArrayList<>();
        Matcher matcher = CONTENT_PATTERN2.matcher(content);
        while (matcher.find()) {
            contentList.add(matcher.group());
        }
        System.out.println(contentList);
    }

3. 分析

  • 當使用CONTENT_PATTERN1和CONTENT_PATTERN2,進行正則匹配,得到的結果與預期完全不同(contentList的元素個數不同)。
  • 區別就在於Pattern的一個‘?’, 進行非貪婪模式匹配。當使用’\S’,因爲是Java所以寫成’\\S’, 匹配任何非空白字符,‘*’,匹配0次或多次。
  • 根據總結,貪婪模式下,儘管正則表達式後面有’==‘加以限制,但內容中’==‘部分仍屬於’\\S’的配配規則,所以會繼續匹配下去。

4. 總結

當我們使用‘\S’, ‘.’, 類似這種字符進行匹配文本,且使用’*‘或者’+'這種多次匹配規則時,一定要考慮是否要加入非貪婪模式限定符。

如果覺得文章對你有用,右側邊欄點個打賞吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章