1. 程式人生 > >正則表示式非貪婪模式的應用

正則表示式非貪婪模式的應用

貪婪模式又叫匹配優先模式,在整個表示式匹配成功的前提下,儘可能多的匹配,而非貪婪模式恰恰相反,在整個表示式匹配成功的前提下,儘可能少的匹配,針對的量詞包括:

{m, n}
{m, }
?
*
+

從書寫正則表示式的差異來看,它們的唯一區別在於非貪婪模式在貪婪模式的量詞後面新增“?”,如下:

{m, n}?
{m, }?
??
*?
+?

下面看一個具體的例子,從“[]”提取需要的字元,首先是貪婪模式:

//  需要提取的字串
String str = "[DTools]              [logs]                [Program Files]";
//  因為是貪婪模式,所以要以[^\\]]尋找字元邊界
Pattern pat = Pattern.compile("\\[([^\\]]+)\\]"); Matcher matcher = pat.matcher(str); while(matcher.find()) { // group(0)為匹配的字串 System.out.println(matcher.group(1)); }

因為是貪婪模式,所以我們必須找出明確的字元邊界,所以要以“[^\]]”進行界定,如果採用非貪婪模式,則可以簡化此操作,如下:

Pattern pat = Pattern.compile("\\[(.+?)\\]");

可見,使用非貪婪模式,可以簡化正則表示式的複雜程度。

結論

充分理解貪婪模式與非貪婪模式的差異,可以更有效地使用正則表示式。