牛客正則題

Java中用正則表達式截取字符串中第一個出現的英文左括號之前的字符串。比如:北京市(海淀區)(朝陽區)(西城區),截取結果爲:北京市。正則表達式爲()
  • ".*?(?=\\()"
  • ".*?(?=\()"
  • ".*(?=\\()"
  • ".*(?=\()"

1.什麼是正則表達式的貪婪與非貪婪匹配

如:String str="abcaxc";

Patter p="ab*c";

貪婪匹配:正則表達式一般趨向於最大長度匹配,也就是所謂的貪婪匹配。如上面使用模式p匹配字符串str,結果就是匹配到:abcaxc(ab*c)。

非貪婪匹配:就是匹配到結果就好,就少的匹配字符。如上面使用模式p匹配字符串str,結果就是匹配到:abc(ab*c)。

2.編程中如何區分兩種模式

默認是貪婪模式;在量詞後面直接加上一個問號?就是非貪婪模式。

量詞:{m,n}:m到n個

*:任意多個

+:一個到多個

?:0或一個
'.' 是一個元字符,匹配 除了換行符以外的任意字符.
'*' 同樣是元字符,不過它代表的不是字符,也不是位置,而是數量——它指定* 前邊
的內容可以連續重複使用任意次以使整個表達式得到匹配.' .*' 連在一起就意味着 任意數量的不包含換行的字符.
(?=exp) 也叫 零寬度正預測先行斷言 ,它 斷言自身出現的位置的後面能匹配表達式exp 。比如\b\w+(?=ing\b) ,
匹配 以ing結尾的單詞的前面部分(除了ing以外的部分) ,如查找 I'm singing while you're dancing. 時,它會
匹配 sing 和 danc 。
然後這道題目
.表示除\n之外的任意字符
*表示匹配0-無窮 
+表示匹配1-無窮
(?=Expression) 順序環視,(?=\\()就是匹配正括號
懶惰模式正則: 
src=".*? (?=\\()) " *? 在正則中代表非貪婪匹配模式,會盡量少的匹配字符,
如果不加 ?就是貪婪模式,此時通配符會把所有字符都匹配掉,後面的就無效了
結果:北京市
因爲匹配到第一個"就結束了一次匹配。不會繼續向後匹配。因爲他懶惰嘛。

發佈了6 篇原創文章 · 獲贊 13 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章