Java中用正則表達式截取字符串中第一個出現的英文左括號以前的字符串。好比:北京市(海淀區)(朝陽區)(西城區),截取結果爲:北京市。正則表達式爲()
-
A ".*?(?=\\()"
-
B ".*?(?=\()"
-
C ".*(?=\\()"
-
D ".*(?=\()"
http://www.cnblogs.com/xudong-bupt/p/3586889.html
1.什麼是正則表達式的貪婪與非貪婪匹配
如:String str="abcaxc"; html
Patter p="ab*c"; 正則表達式
貪婪匹配:正則表達式通常趨向於最大長度匹配,也就是所謂的貪婪匹配。如上面使用模式p匹配字符串str,結果就是匹配到:abcaxc(ab*c)。 編程
非貪婪匹配:就是匹配到結果就好,就少的匹配字符。如上面使用模式p匹配字符串str,結果就是匹配到:
abc(ab*c)。
2.編程中如何區分兩種模式 post
默認是貪婪模式;在量詞後面直接加上一個問號?就是非貪婪模式。 spa
量詞:{m,n}:m到n個 ssr
*:任意多個 code
+:一個到多個 htm
?: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,
知識點是正則表達式中的貪婪匹配。
一、正則表達式中元字符:
".":匹配除去\n換行符的任意字符
"*":匹配前面子表達式任意次
"?":匹配前面子表達式的0次或1次,若是前面也是元字符,那麼它就是非貪婪匹配了(默認是貪婪匹配的)。
二、B中 ".*?(?=\\()"中後面的(?=\\()它是(?=assert)的形式,叫作順序環視,也就是前面.*?匹配到的字符後面必需要緊接着有assrt中聲明的值,也就是左括號(其中\\都是轉義字符),可是匹配的到的串是不包含assrt中聲明的內容的。
三、題中,原串 「北京市(海淀區)(朝陽區)(西城區)」,首先匹配到北京市(前部分),而後北京市後面有左括號( ,這是後面順序環視部分,可是不包括左括號,這樣整個串就匹配完了,截取到的串爲「北京市」。