程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> RegularExpressions(2) RegularExpressions 支持的正則表達式語

RegularExpressions(2) RegularExpressions 支持的正則表達式語

編輯:Delphi

 長時間不用正則, 語法都忘了; 以下是基於之前的資料又結合 msdn 復習整理的記錄:

TRegex.Create('abc');

  abcde ABCDE abcde

  默認區分大小寫

TRegex.Create('abc', [roIgnoreCase]);

  abcde ABCDE abcde

  使用 roIgnoreCase 選項, 可不區分大小寫

TRegex.Create('B');

  ABC

匹配某個 Ansi 字符有多種方法, 下面都是匹配 'B': 
TRegex.Create('\x42'); { 十六進制, 只能 1-2 位 } 
TRegex.Create('\102'); { 八進制, 須 3 位 } 
TRegex.Create(#66);    { 只用於 Delphi } 
TRegex.Create(#$42);   { 只用於 Delphi } 
 
{ 當前版本不支持 \u 和 \U; 類似不支持的還有: \L \I \N \c } 

TRegex.Create('萬');

  萬一

匹配某個 UniCode 字符方法不多, 下面也是匹配 '萬': 
TRegex.Create(#19975); { 只用於 Delphi } 
TRegex.Create(#$4E07); { 只用於 Delphi } 
 
{ 當前版本不支持 \u 和 \U } 

TRegex.Create(' ');

  A B C

這是匹配一個空格, 還可以: 
TRegex.Create('\x20'); { 十六進制, 只能 1-2 位 } 
TRegex.Create('\040'); { 八進制, 須 3 位 } 
TRegex.Create(#32);    { 只用於 Delphi } 
TRegex.Create(#$20);   { 只用於 Delphi } 

TRegex.Create('\*');

  A*B

  下列字符在正則表達式中有特殊意義, 使用時需要轉義: . $ ^ { [ ( | ) * + ? \


需要轉義的還有一些空白字符:\r { 回車符 } 
\n { 換行符 } 
\f { 換頁符 } 
\t { 制表符 } 
\v { 垂直制表符 } 
\e { Esc 符 } 
\a { 響鈴 } 
\b { 退格符; 只用在 [] 和替換模式中, 更多時候表示單詞邊界 } 
 
給不需要轉義的字符前置 \ 後, 會忽略 \ 

TRegex.Create('Monday|Wednesday|Friday');

  Monday Tuesday Wednesday Thursday Friday Saturday Sunday

  | 是或者

TRegex.Create('[BD]');

  ABCDE

  包含在 [] 中的...相當於 | (或者)

TRegex.Create('[^BD]');

  ABCDE

  不在 [] 中的...

TRegex.Create('[A-Z]');

  RegularExpressions_1.0 適用於 Delphi 2009 及之後的版本

  匹配大寫字母

TRegex.Create('[a-z]');

  RegularExpressions_1.0 適用於 Delphi 2009 及之後的版本

  匹配小寫字母

TRegex.Create('[0-9]');

  RegularExpressions_1.0 適用於 Delphi 2009 及之後的版本

  匹配阿拉伯數字

TRegex.Create('[A-Za-z]');

  RegularExpressions_1.0 適用於 Delphi 2009 及之後的版本

  匹配英文字母

TRegex.Create('[0-9.]');

  RegularExpressions_1.0 適用於 Delphi 2009 及之後的版本

  匹配阿拉伯數字和小數點; 小數點 . 不在 [] 中時可匹配任意字符

TRegex.Create('[A-C]X');

  AX BX CX DX CS DS ES GS FS EAX EBX ECX EDX

TRegex.Create('['#$4E00'-'#$9FFF']');

 萬一的 Delphi 博客

這個表達式是匹配漢字, 也可以這樣寫: TRegex.Create('[一-龥]'); 
前面提到, 當前版本暫不支持 \u, 如果支持的話可以這樣寫: TRegex.Create('[\u4E00-\u9FFF]'); 
其實像這種匹配應該使用字符集匹配, 可惜暫不支持, 後面會有提到. 

TRegex.Create('Go{2}gle');

  Ggle Gogle Google Gooogle Goooogle Gooooogle

  {m} 表示重復 m 次

TRegex.Create('Go{2,4}gle');

  Ggle Gogle Google Gooogle Goooogle Gooooogle

  {m,n} 表示重復 m 到 n 次

TRegex.Create('Go{2,}gle');

  Ggle Gogle Google Gooogle Goooogle Gooooogle

  {m,} 表示重復 m 次以上

TRegex.Create('Go+gle');

  Ggle Gogle Google Gooogle Goooogle Gooooogle

  + 表示 1 個或多個

TRegex.Create('Go*gle');

  Ggle Gogle Google Gooogle Goooogle Gooooogle

  * 表示 0 個或多個

TRegex.Create('Go?gle');

  Ggle Gogle Google Gooogle Goooogle Gooooogle

  ? 表示 0 個或 1 個; 它還用於非貪婪匹配和子表達式

TRegex.Create('\d');

  A1 B2 C3

  \d 匹配阿拉伯數字; 相同於 [0..9]

TRegex.Create('\D');

  A1 B2 C3

  \D 匹配非數字字符, 包括空字符; 相同於 [^0..9] 或者 [^\d]

TRegex.Create('\s');

  A1 B2 C3

  \s 匹配空白; 相同於 [ \f\n\r\t\v]

TRegex.Create('\S');

  A1 B2 C3

  \S 匹配非空字符; 相同於 [^ \f\n\r\t\v]

TRegex.Create('\w');

  A_1 B-2 C=3

  \w 匹配單詞字符; 相同於 [A-Za-z_0-9]

TRegex.Create('\W');

  A_1 B-2 C=3

  \W 匹配非單詞字符; 相同於 [^A-Za-z_0-9]

TRegex.Create('.');

  AAA

  BBB

  CCC

. 匹配除換行符以外的任意字符; 如果指定了 roSingleline 選項, 也能匹配換行符, 像這樣: 
TRegex.Create('.', [roSingleline]); 
也有例外: 如果 . 在 [] 中, 它只代表它自己. 

TRegex.Create('\bDelphi\b');

  Embarcadero_Delphi, DelphiBBS, MyDelphiBBS, www.Delphi.com

  \b 表示單詞邊界; 另外 \b 在 [] 和替換模式中表示退格符

TRegex.Create('\bDelphi');

  Embarcadero_Delphi, DelphiBBS, MyDelphiBBS, www.Delphi.com

  \b 示例: 右邊是邊界

TRegex.Create('Delphi\b');

  Embarcadero_Delphi, DelphiBBS, MyDelphiBBS, www.Delphi.com

  \b 示例: 左邊是邊界

TRegex.Create('\BDelphi\B');

  Embarcadero_Delphi, DelphiBBS, MyDelphiBBS, www.Delphi.com

  \B 和 \b 相反, 匹配非單詞邊界

TRegex.Create('\b\w+\b');

  one two three four

  這是匹配所有英文單詞的例子

TRegex.Create('\p{P}');

  Ok? Ok!-是嗎?是的!

  \p 組合 {} 可以匹配更多的 UniCode 字符, \p{P} 是匹配標點符號;

  它還可以細化, 譬如 \p{Pi} 匹配前引號 \p{Pf} 匹配後引號; 下面是詳細列表:

C { 控制字符; 細分為: Cc(控制)、Cf(格式)、Cs(代理項)、Co(私用)、Cn(說是未使用, 但相當於"其他") } 
L { 字母; 細分為: Lu(大寫)、Ll(小寫)、Lt(詞首大寫)、Lm(修飾符)、Lo(其他) } 
M { 附加符號; 細分為: Mn(非間距)、Mc(間距組合)、Me(封閉) } 
N { 數字; 細分為: Nd(十進制)、Nl(字母)、No(其他) } 
P { 標點; 細分為: Pc(連接符)、Pd(短劃線)、Ps(開始)、Pe(結束)、Pi(前引號)、Pf(後引號)、Po(其他) } 
S { 符號; 細分為: Sm(數學)、Sc(貨幣)、Sk(修飾符)、So(其他) } 
Z { 分隔符; 細分為: Zs(空白)、Zl(行)、Zp(段落) } 

Net 可支持字符集, 譬如匹配簡體中文: \p{IsCJKUnifIEdIdeographs}; 可惜當前版本暫不支持.

TRegex.Create('\P{P}');

  Ok? Ok!-是嗎?是的!

  \P{} 是給 \p{} 取反; 這和 \D \S \W 是一樣的.

TRegex.Create('\p{Nl}');

  AⅠBⅡCⅢ

  \p 實例: 匹配羅馬數字

TRegex.Create('\p{Pi}');

  “ABC” ‘abc’

  \p 實例: 匹配前引號

TRegex.Create('\p{Pi}');

  “ABC” ‘abc’

  \p 實例: 匹配後引號

TRegex.Create('\p{Ps}');

  (x)[x]{x}〈x〉《x》「x」『x』【x】〔x〕〖x〗

  \p 實例: 匹配開始標點

TRegex.Create('\p{Pe}');

  (x)[x]{x}〈x〉《x》「x」『x』【x】〔x〕〖x〗

  \p 實例: 匹配結束標點

TRegex.Create('\p{Sc}');

  $1 ¢2 £3 ¥4 ﹩5 $6 ¢7 £8 ¥9

  \p 實例: 匹配貨幣符號

TRegex.Create('^Delphi');

  Delphi Delphi Delphi

  Delphi Delphi Delphi

  ^ 匹配行首; 在非多行模式下同 \A

TRegex.Create('^Delphi', [roMultiline]);

  Delphi Delphi Delphi

  Delphi Delphi Delphi

  ^ 在多行模式下

TRegex.Create('Delphi$');

  Delphi Delphi Delphi

  Delphi Delphi Delphi

  $ 匹配行尾; 在非多行模式下同 \Z

TRegex.Create('Delphi$', [roMultiline]);

  Delphi Delphi Delphi

  Delphi Delphi Delphi

  $ 在多行模式下


TRegex.Create('\ADelphi');

  Delphi Delphi Delphi

  Delphi Delphi Delphi

  \A 匹配行首; 在多行模式下也是如此.

TRegex.Create('Delphi\Z');

  Delphi Delphi Delphi

  Delphi Delphi Delphi

  \Z(或\z) 匹配行尾; 在多行模式下也是如此.

TRegex.Create('<.*>');

  <html><head></head><body>ABC</body></Html>

  太貪婪了, 一下子都匹配了; 這就是所謂的貪婪匹配, 是默認的; 讓匹配不貪婪只需要一個 ?

TRegex.Create('<.*?>');

  <html><head></head><body>ABC</body></Html>

  這是非貪婪匹配, ? 也叫惰性限制符;

  * ? + {m} {m,n} {m,} 的本性都是貪婪的, 都可以後綴一個 ? 成為非貪婪.

TRegex.Create('Delphi(?=20)');

  Delphi7; Delphi2009; Delphi2010

  (?=右邊是); 這就是所謂的臨界匹配, 下續...

TRegex.Create('Delphi(?!20)');

  Delphi7; Delphi2009; Delphi2010

  (?!右邊不是)

TRegex.Create('(?<=B)123');

  A123, B123, C123

  (?<=左邊是)

TRegex.Create('(?<!B)123');

  A123, B123, C123

  (?<!左邊不是); 如果 () 中不是臨界匹配就是 "子表達式"

TRegex.Create('([A-Z])\w+');

  one One two Two three FOUR

  這是匹配首字母大寫的英文單詞, 用到了子表達式; 其中的子表達式也同時匹配到了:

  one One two Two three FOUR

如果不需要子表達式的匹配結果, 可以在子表達式前加上 "?:", 如: 
TRegex.Create('(?:[A-Z])\w+\'); 
還可以通過 roExplicitCapture 選項來代替 ?: 的作用. 


TRegex.Create('([A-Z])\w+', [roExplicitCapture]);

  one One two Two three FOUR

但 roExplicitCapture 並不禁止用 ?<> 命名的子表達式獲得匹配結果, 如: 
TRegex.Create('(?<Name>[A-Z])\w+', [roExplicitCapture]); 
有更多時候也需要子表達式的匹配結果, 並且繼續用於表達式中, 還有多種使用方法. 

TRegex.Create('([\w])\w+\1');

  abba addr TNT _ABC_

  子表達式可以有多個, 可以在後面的表達式中用 \1 \2 \3 ...引用(這就是所謂的反向引用);

  引用時要避免和八進制混淆, 但避免的最好方法是使用其他方法引用.

TRegex.Create('(?<One>[\w])\w+\k<One>');

  abba addr TNT _ABC_

  這同上一例, 只是給子表達式取名為 One, 然後再用 \k<> 引用. 可以用單引號 ' 代替子表達式兩邊的 <>, 不過這在 Delphi 中不方便, 如:TRegex.Create('(?''One''[\w])\w+\k''One''');Net 還支持 <序號>, 此版本當前不支持. 另外子表達式還支持嵌套, 序號次序從外向裡.

TRegex.Create('(A)\d{3}|\d{4}');

  A1, A12, A123, A1234, B1, B12, B123, B1234

  可利用子表達式執行類似 IfThen 的判斷, 這就是所謂的替換構造; 本例是:

  假如首字母是 A 則匹配: 首字母外加三個數字; 反之則匹配: 首字母外加四個數字

TRegex.Create('cd(?#這是注釋)e');

  abcdefg

  這是第一種注釋方法

TRegex.Create('cde#這是注釋', [roIgnorePatternWhitespace]);

  abcdefg

  這是第二種注釋方法, 只有打開 roIgnorePatternWhitespace 選項才能使用

TRegex.Create('Del phi', [roIgnorePatternWhitespace]);

  萬一的 Delphi 博客

  這是忽略表示中空白的測試, 它也同時忽略了查詢目標的空白;

  但有時會多匹配一個行首, 不知是不是 bug.

TRegex.Create('(?i)Delphi|one|(?-i)two');

  Delphi ONE TWO

  這是使用內聯選項的測試; (?i)是忽略大小寫, (?-i)是取消剛才的忽略.

  譬如: (?ix-ms) 是啟用 i 和 x 選項, 同時取消 m 和 s 選項.

  關於更多選項和內聯選項參加後面的列表.

  正則表達式選項列表:

roIgnoreCase(i)        //不區分大小寫 
roMultiline(m)        //多行模式; 它只是修改了 ^(行首) 和 $(行尾)的意義 
roExplicitCapture(n)     //不讓子表達式獲取匹配結果, 類似 ?: 但它不禁止用 ?<> 命名的子表達式 
roSingleline(s)        //單行模式; 它只是修改了 . 的意義, 使用後 . 也可以匹配換行符 
roIgnorePatternWhitespace(x) //兩個意思: 1、排除非轉義空白; 2、啟用 # 後面的注釋 
roStudy            //同時編譯表達式; 編譯需要時間, 但編譯後執行就快了 
 
{ 其中的 i m n s x 是在表達式中直接調用這些選項的內聯標記, roStudy 沒有對應的標記 } 





  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved