正則表達式基礎(Regular Expression)

正則表達式簡介

n  爲何須要正則表達式?javascript

文本的複雜處理。java

n  正則表達式的優點和用途?正則表達式

q  一種強大而靈活的文本處理工具;數據庫

q  提供了一種緊湊的、動態的方式,可以以一種徹底通用的方式來解決各類字符串處理(例如:驗證、查找、替換等)問題;編程

q  大部分語言[d1] 、數據庫都支持正則表達式。ruby

n  正則表達式定義:工具

q  正如他的名字同樣是描述了一個規則[d2] ,經過這個規則能夠匹配一類字符串。學習

n  正則表達式的用處:測試

驗證給定字符串是否符合指定特徵,好比驗證是不是合法的郵件地址。spa

q  用來查找字符串,從一個長的文本中查找符合指定特徵的字符串。

q  用來替換,比普通的替換更強大

工具軟件RegexBuddy的使用

n  爲了提升開發效率,通常都先在工具軟件中測試正則表達式,經過測試後,纔在程序中使用。

 

正則表達式規則

n  普通字符

q  字母、數字、漢字、下劃線、以及沒有特殊定義的標點符號,都是普通字符」。表達式中的普通字符,在匹配一個字符串的時候,匹配與之相同的一個字符

n  簡單的轉義字符

\n

表明換行符

\t

製表符

\\

表明\自己

\^ ,\$,\.,\(, \) , \{, \} , \? , \+ , \* , \| ,\[, \]

匹配這些字符自己

 

標準字符集合:可以與 ‘多種字符’ 匹配的表達式

q  (注意區分大小寫,大寫是相反的意思

\d

任意一個數字,0~9 中的任意一個

\w

任意一個字母數字下劃線,也就是 A~Z,a~z,0~9,_ 中任意一個

\s

包括空格、製表符、換行符等空白字符的其中任意一個

.

小數點能夠匹配除了換行符(\n)之外[d3] 的任意一個字符

 

自定義字符集合:[ ]方括號匹配方式,可以匹配方括號中任意一個字符

[ab5@]

匹配 "a" 或 "b" 或 "5" 或 "@"

[^[d4] abc]

匹配 "a","b","c" 以外的任意一個字符

[f-k]

匹配 "f"~"k" 之間的任意一個字母

[^A-F0-3]

匹配 "A"~"F","0"~"3" 以外的任意一個字符

注意事項:

1. 正則表達式中的特殊符號,若是被包含於中括號中,則失去特殊意義, \ [ ] : ^ - 除外

2. 標準字符集合,除小數點(.)外,若是被包含於中括號中,自定義字符集合將包含該集合。
好比:[\d.\-+],將能夠匹配數字,小數點和 + - 符號。(小數點和 + 號失去特殊意義)

 

n  修飾匹配次數的特殊符號

{n}

表達式重複n次

{m,n}

表達式至少重複m次,最多重複n次

{m,}[d5] 

表達式至少重複m次

  ?

匹配表達式0次或者1次,至關於 {0,1}

  +

表達式至少出現1次,至關於 {1,}

  *

表達式不出現或出現任意次,至關於 {0,}

n  匹配次數中的貪婪模式(匹配字符越多越好)

q  「{m,n}」, 「{m,}」, 「?」, 「*」, 「+」,具體匹配的次數隨被匹配的字符串而定。這種重複匹配不定次數的表達式在匹配過程當中,老是儘量多的匹配。

n  匹配次數中的非貪婪模式(匹配字符越少越好)

在修飾匹配次數的特殊符號後再加上一個 "?" ,則可使匹配次數不定的表達式儘量少的匹配,使可匹配可不匹配的表達式,儘量的 "不匹配"。

字符邊界(本組標記匹配的不是字符而是位置,符合某種條件的位置)

^

與字符串開始的地方匹配

$

與字符串結束的地方匹配

\b

匹配一個單詞邊界[d6] 

 

n  選擇符和分組

表達式

做用 

|

左右兩邊表達式之間 "或" 關係,匹配左邊或者右邊

( )

(1). 在被修飾匹配次數的時候,括號中的表達式能夠做爲總體被修飾

(2). 取匹配結果的時候,括號中的表達式匹配到的內容能夠被單獨獲得

(3). 每一對括號會分配一個編號,使用 () 的捕獲根據左括號的順序從 1 開始自動編號。捕獲元素編號爲零的第一個捕獲是由整個正則表達式模式匹配的文本[d7] 

 

反向引用(\nnn

q  每一對()會分配一個編號,使用 () 的捕獲根據左括號的順序從 1 開始自動編號

q  經過反向引用,能夠對分組已捕獲的字符串進行引用。

n  非捕獲組(?:xxx)[d8] 

q  與捕獲組的區別在於不捕獲匹配的文本,僅僅做爲分組。其餘地方一致。

 

n  模式修改符 (?ismg[c9] )*****(?-ismg)  (用的很少,聽聽就行!)

q  在正則表達式中間,對匹配模式進行修改。

大小寫模式修改,好比匹配a,A

  1. 1.      [aA]
  2. 2.      把整個模式修改成大小寫不敏感。
  3. 3.      (?i)a(?-i)

 

 

 

 

預搜索(零寬斷言[d10] )

q  判斷當前位置的先後字符,是否符合指定的條件,但不匹配先後的字符。是對位置的匹配。

(?=exp)

斷言自身出現的位置的後面能匹配表達式exp

(?<=exp)

斷言自身出現的位置的前面能匹配表達式exp

(?!exp)

斷言此位置的後面不能匹配表達式exp

(?<!exp)

斷言此位置的前面不能匹配表達式exp

正則表達式的匹配模式

n  IGNORECASE 忽略大小寫模式

q  匹配時忽略大小寫。

q  默認狀況下,正則表達式是要區分大小寫的。

n  SINGLELINE 單行模式

q  整個文本看做一個字符串,只有一個開頭,一個結尾。

q  使小數點 "." 能夠匹配包含換行符(\n)在內的任意字符。

n  MULTILINE 多行模式

q  每行都是一個字符串,都有開頭和結尾。

q  在指定了 MULTILINE 以後,若是須要僅匹配字符串開始和結束位置,可使用 \A 和 \Z

開發中使用正則表達式的流程

  1. 分析所要匹配的數據,寫出測試用的典型數據
  2. 在工具軟件中進行匹配測試
  3. 在程序中調用經過測試的正則表達式

 [d1]Java,javascript, perl, ruby, groovy等。

Oracle 10g。。

 [d2]學習正則表達式很大程度上就是學習正則表達式的語法規則

 [d3]在單行模式下面能夠匹配包含換行符在內的任意字符。

 [d4]寫到方括號內時表示取非的含義。

 [d5]沒有{,5}這樣的寫法。

 [d6]精確地說,\b匹配這樣一個位置:前面的字符和後面的字符不全是\w.

 [d7]講到java編程時給你們詳細介紹。

 [d8]非捕獲指的是該組對應的字符串內容不會保存到內存中,也就不能進行反向引用。

對於比較大的文本進行處理,若是不用反向引用,可使用非捕獲組節省內存資源。

 [c9]i: insensitive

s: singleLine

m: multiline

g: global

 [d10]這個位置應該符合某個條件。

相關文章
相關標籤/搜索