正則表示式的基礎認識
**次數符號**
```
* 0或多次
+ 1或多次
?0或1次
{n} 恰n次
{n,m} 從n到m次
```
**其他符號**
符號 等價形式
```
\d [0-9]
\D [^0-9]
\w [a-zA-Z_0-9]
\W [^a-zA-Z_0-9]
\s [\t\n\r\f]
\S [^\t\n\r\f]
. 任何字元
```
**邊界匹配器**
行開頭 ^
行結尾 $
單詞邊界 \b
**貪婪模式**:最大長度匹配 非貪婪模式:匹配到結果就好,最短匹配。區別就是有沒有加一個? 有就時非貪婪模式,也就是懶模式,懶得再繼續匹配。
**環視**
```
字元 描述 匹配物件
. 單個任意字元
[...] 字元組 列出的任意字元
[^...] 未列出的任意字元
^ caret 行的起始位置
$ dollar 行的結束位置
\< 單詞的起始位置
\> 單詞的結束位置
\b 單詞邊界
\B 非單詞邊界
(?=Expression) 順序肯定環視 成功,如果右邊能夠匹配
(?!Expression) 順序否定環視 成功,如果右邊不能夠匹配
(?<=Expression) 逆序肯定環視 成功,如果左邊能夠匹配
(?<!Expression) 逆序否定環視 成功,如果左邊不能夠匹配
```
舉例:北京市(海淀區)(朝陽區)(西城區)
Regex: .*(?=\\()
**模式和匹配器的典型呼叫次序**
1. 把正則表示式編譯到模式中
Pattern p = Pattern.compile("a*b");
2. 建立給定輸入與此模式的匹配器
Matcher m = p.matcher("aaab");
3. 嘗試將整個區域與此模式匹配
boolean b = m.matches();
例子及解析:
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=".*? (?=\\()) " *? 在正則中代表非貪婪匹配模式,會盡量少的匹配字元,
如果不加 ?就是貪婪模式,此時萬用字元會把所有字元都匹配掉,後面的就無效了
結果:北京市
因為匹配到第一個"就結束了一次匹配。不會繼續向後匹配。因為他懶惰嘛。