正則入門小隨

来源:http://www.cnblogs.com/smbk/archive/2016/05/26/5532168.html
-Advertisement-
Play Games

學習正則表達式的最好方法是從例子開始,理解例子之後再自己對例子進行修改,實驗。下麵給出了不少簡單的例子,並對它們作了詳細的說明。 假設你在一篇英文小說里查找hi,你可以使用正則表達式hi。 這幾乎是最簡單的正則表達式了,它可以精確匹配這樣的字元串:由兩個字元組成,前一個字元是h,後一個是i。通常,處 ...


學習正則表達式的最好方法是從例子開始,理解例子之後再自己對例子進行修改,實驗。下麵給出了不少簡單的例子,並對它們作了詳細的說明。

假設你在一篇英文小說里查找hi,你可以使用正則表達式hi。

這幾乎是最簡單的正則表達式了,它可以精確匹配這樣的字元串:由兩個字元組成,前一個字元是h,後一個是i。通常,處理正則表達式的工具會提供一個忽略大小寫的選項,如果選中了這個選項,它可以匹配hi,HI,Hi,hI這四種情況中的任意一種。

不幸的是,很多單詞里包含hi這兩個連續的字元,比如him,history,high等等。用hi來查找的話,這裡邊的hi也會被找出來。如果要精確地查找hi這個單詞的話,我們應該使用\bhi\b。

\b是正則表達式規定的一個特殊代碼(好吧,某些人叫它元字元,metacharacter),代表著單詞的開頭或結尾,也就是單詞的分界處。雖然通常英文的單詞是由空格,標點符號或者換行來分隔的,但是\b並不匹配這些單詞分隔字元中的任何一個,它只匹配一個位置。

如果需要更精確的說法,\b匹配這樣的位置:它的前一個字元和後一個字元不全是(一個是,一個不是或不存在)\w。

假如你要找的是hi後面不遠處跟著一個Lucy,你應該用\bhi\b.*\bLucy\b。

這裡,.是另一個元字元,匹配除了換行符以外的任意字元。*同樣是元字元,不過它代表的不是字元,也不是位置,而是數量——它指定*前邊的內容可以連續重覆使用任意次以使整個表達式得到匹配。因此,.*連在一起就意味著任意數量的不包含換行的字元。現在\bhi\b.*\bLucy\b的意思就很明顯了:先是一個單詞hi,然後是任意個任意字元(但不能是換行),最後是Lucy這個單詞。

換行符就是'\n',ASCII編碼為10(十六進位0x0A)的字元。

如果同時使用其它元字元,我們就能構造出功能更強大的正則表達式。比如下麵這個例子:

0\d\d-\d\d\d\d\d\d\d\d匹配這樣的字元串:以0開頭,然後是兩個數字,然後是一個連字型大小“-”,最後是8個數字(也就是中國的電話號碼。當然,這個例子只能匹配區號為3位的情形)。

這裡的\d是個新的元字元,匹配一位數字(0,或1,或2,或……)。-不是元字元,只匹配它本身——連字元(或者減號,或者中橫線,或者隨你怎麼稱呼它)。

為了避免那麼多煩人的重覆,我們也可以這樣寫這個表達式:0\d{2}-\d{8}。這裡\d後面的{2}({8})的意思是前面\d必須連續重覆匹配2次(8次)。

(如果需要更精確的說法,\b匹配這樣的位置:它的前一個字元和後一個字元不全是(一個是,一個不是或不存在)\w。

(換行符就是'\n',ASCII編碼為10(十六進位0x0A)的字元。)

常用的元字元
代碼說明
. 匹配除換行符以外的任意字元
\w 匹配字母或數字或下劃線或漢字
\s 匹配任意的空白符
\d 匹配數字
\b 匹配單詞的開始或結束
^ 匹配字元串的開始
$ 匹配字元串的結束
常用的限定符
代碼/語法說明
* 重覆零次或更多次
+ 重覆一次或更多次
? 重覆零次或一次
{n} 重覆n次
{n,} 重覆n次或更多次
{n,m} 重覆n到m次
常用的反義代碼
代碼/語法說明
\W 匹配任意不是字母,數字,下劃線,漢字的字元
\S 匹配任意不是空白符的字元
\D 匹配任意非數字的字元
\B 匹配不是單詞開頭或結束的位置
[^x] 匹配除了x以外的任意字元
[^aeiou] 匹配除了aeiou這幾個字母以外的任意字元
常用分組語法
分類代碼/語法說明
捕獲 (exp) 匹配exp,並捕獲文本到自動命名的組裡
(?<name>exp) 匹配exp,並捕獲文本到名稱為name的組裡,也可以寫成(?'name'exp)
(?:exp) 匹配exp,不捕獲匹配的文本,也不給此分組分配組號
零寬斷言 (?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp後面的位置
(?!exp) 匹配後面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
註釋 (?#comment) 這種類型的分組不對正則表達式的處理產生任何影響,用於提供註釋讓人閱讀
懶惰限定符
代碼/語法說明
*? 重覆任意次,但儘可能少重覆
+? 重覆1次或更多次,但儘可能少重覆
?? 重覆0次或1次,但儘可能少重覆
{n,m}? 重覆n到m次,但儘可能少重覆
{n,}? 重覆n次以上,但儘可能少重覆
常用的處理選項
名稱說明
IgnoreCase(忽略大小寫) 匹配時不區分大小寫。
Multiline(多行模式) 更改^和$的含義,使它們分別在任意一行的行首和行尾匹配,而不僅僅在整個字元串的開頭和結尾匹配。(在此模式下,$的精確含意是:匹配\n之前的位置以及字元串結束前的位置.)
Singleline(單行模式) 更改.的含義,使它與每一個字元匹配(包括換行符\n)。
IgnorePatternWhitespace(忽略空白) 忽略表達式中的非轉義空白並啟用由#標記的註釋。
ExplicitCapture(顯式捕獲) 僅捕獲已被顯式命名的組。
尚未詳細討論的語法
代碼/語法說明
\a 報警字元(列印它的效果是電腦嘀一聲)
\b 通常是單詞分界位置,但如果在字元類里使用代表退格
\t 製表符,Tab
\r 回車
\v 豎向製表符
\f 換頁符
\n 換行符
\e Escape
\0nn ASCII代碼中八進位代碼為nn的字元
\xnn ASCII代碼中十六進位代碼為nn的字元
\unnnn Unicode代碼中十六進位代碼為nnnn的字元
\cN ASCII控制字元。比如\cC代表Ctrl+C
\A 字元串開頭(類似^,但不受處理多行選項的影響)
\Z 字元串結尾或行尾(不受處理多行選項的影響)
\z 字元串結尾(類似$,但不受處理多行選項的影響)
\G 當前搜索的開頭
\p{name} Unicode中命名為name的字元類,例如\p{IsGreek}
(?>exp) 貪婪子表達式
(?<x>-<y>exp) 平衡組
(?im-nsx:exp) 在子表達式exp中改變處理選項
(?im-nsx) 為表達式後面的部分改變處理選項
(?(exp)yes|no) 把exp當作零寬正向先行斷言,如果在這個位置能匹配,使用yes作為此組的表達式;否則使用no
(?(exp)yes) 同上,只是使用空表達式作為no
(?(name)yes|no) 如果命名為name的組捕獲到了內容,使用yes作為表達式;否則使用no
(?(name)yes) 同上,只是使用空表達式作為no

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • _introduce.text=status.introduce; //設置行間距 NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]initWithString:_introduce.te ...
  • 以下資料摘錄整理自老羅的Android之旅博客,是對老羅的博客關於Android底層原理的一個抽象的知識概括總結(如有錯誤歡迎指出)(侵刪): http://blog.csdn.net/luoshengyang/article/details/8923485 http://blog.csdn.net ...
  • ...
  • var app={}; app.cloneobj= function(obj){ var o; if(typeof obj == "object"){ if(obj null){ o= null}else{ if(obj instanceof Array){ o=[]; for(var i= 0; ...
  • eg : data:{[ {"name":"paul","ege":12}, {"name":"paul","ege":13}, {"name":"paul","ege":14} ]}; var app={}; app.sortOn= function(arr,prop,sortCompareFun ...
  • 前言 關於 CSS 的介紹,基本上告一段落了。在該博客中將介紹如何通過 CSS 去設置一個 HTML 元素,顯示在 Web 頁面的位置。 定位 概述 定義元素位置的基準,即:該元素與 HTML 文檔流 和 其他 HTML 元素的關係。 四種定位方式 Static(靜態定位) 預設值(沒有定位),元素 ...
  • eg: var app={}; app.tempEngine= (function () { var pattern = /\{(\w*[:]*[=]*\w+)\}(?!})/g; return function (template, json) { return template.replace( ...
  • http://handyxuefeng.blog.163.com/blog/static/454521722013111714040259/ http://book.51cto.com/art/201106/270499.htm http://www.cnblogs.com/blackbird/ar ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...