Java中用正則表達式截取字符串中第一個出現的英文左括號之前的字符串。比如:北京市(海淀區)(朝陽區)(西城區),截取結果為:北京市。正則表達式為()
-
A ".*?(?=\\()"
-
B ".*?(?=\()"
-
C ".*(?=\\()"
-
D ".*(?=\()"
http://www.cnblogs.com/xudong-bupt/p/3586889.html
1.什么是正則表達式的貪婪與非貪婪匹配
如:String str="abcaxc";
Patter p="ab*c";
貪婪匹配:正則表達式一般趨向於最大長度匹配,也就是所謂的貪婪匹配。如上面使用模式p匹配字符串str,結果就是匹配到:abcaxc(ab*c)。
非貪婪匹配:就是匹配到結果就好,就少的匹配字符。如上面使用模式p匹配字符串str,結果就是匹配到:
abc(ab*c)。
2.編程中如何區分兩種模式
默認是貪婪模式;在量詞后面直接加上一個問號?就是非貪婪模式。
量詞:{m,n}:m到n個
*:任意多個
+:一個到多個
?:0或一個
以上來自博主的博客,然后這道題目
.表示除\n之外的任意字符
*表示匹配0-無窮 +表示匹配1-無窮
(?=Expression) 順序環視,(?=\\()就是匹配正括號
懶惰模式正則:
src=".*? (?=\\()) "
src=".*? (?=\\()) "
結果:北京市
因為匹配到第一個"就結束了一次匹配。不會繼續向后匹配。因為他懶惰嘛。
A ".*?(?=\\()"
B ".*?(?=\()"
C ".*(?=\\()"
D ".*(?=\()"
String text = "北京市(海淀區)(朝陽區)(西城區)";
Pattern pattern = Pattern.compile(".*?(?=\\()" );B ".*?(?=\()"
C ".*(?=\\()"
D ".*(?=\()"
前面的.*?是非貪婪匹配的意思, 表示找到最小的就可以了
(?=Expression) 順序環視,(?=\\()就是匹配正括號
String text = "北京市(海淀區)(朝陽區)(西城區)";
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
System.out.println(matcher.group(0));
}
解析
選A,
知識點是正則表達式中的貪婪匹配。
1、正則表達式中元字符:
".":匹配除去\n換行符的任意字符
"*":匹配前面子表達式任意次
"?":匹配前面子表達式的0次或1次,如果前面也是元字符,那么它就是非貪婪匹配了(默認是貪婪匹配的)。
2、B中 ".*?(?=\\()"中后面的(?=\\()它是(?=assert)的形式,叫做順序環視,也就是前面.*?匹配到的字符后面必須要緊接着有assrt中聲明的值,也就是左括號(其中\\都是轉義字符),但是匹配的到的串是不包含assrt中聲明的內容的。
3、題中,原串 “北京市(海淀區)(朝陽區)(西城區)”,首先匹配到北京市(前部分),然后北京市后面有左括號( ,這是后面順序環視部分,但是不包括左括號,這樣整個串就匹配完了,截取到的串為“北京市”。