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’, ‘.’, 類似這種字符進行匹配文本,且使用’*‘或者’+'這種多次匹配規則時,一定要考慮是否要加入非貪婪模式限定符。