1. 程式人生 > >正則表示式的基礎認識

正則表示式的基礎認識

 

**次數符號**
```
* 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=".*? (?=\\()) " *? 在正則中代表非貪婪匹配模式,會盡量少的匹配字元,

如果不加 ?就是貪婪模式,此時萬用字元會把所有字元都匹配掉,後面的就無效了

結果:北京市

因為匹配到第一個"就結束了一次匹配。不會繼續向後匹配。因為他懶惰嘛。