1. 程式人生 > >1小時教你學會正則表示式

1小時教你學會正則表示式

想必很多人都對正則表示式都頭疼.今天,我以我的認識,加上網上一些文章,希望用常人都可以理解的表達方式.來和大家分享學習經驗.  開篇,還是得說說 ^ 和 $ 他們是分別用來匹配字串的開始和結束,以下分別舉例說明

  "^The": 開頭一定要有"The"字串;
  "of despair$": 結尾一定要有"of despair" 的字串;

  那麼,
  "^abc$": 就是要求以abc開頭和以abc結尾的字串,實際上是隻有abc匹配
  "notice": 匹配包含notice的字串

  你可以看見如果你沒有用我們提到的兩個字元(最後一個例子),就是說 模式(正則表示式) 可以出現在被檢驗字串的任何地方,你沒有把他鎖定到兩邊
  接著,說說 '*', '+',和 '?',
  他們用來表示一個字元可以出現的次數或者順序. 他們分別表示:
  "zero or more"相當於{0,},
  "one or more"相當於{1,},
  "zero or one."相當於{0,1}, 這裡是一些例子:

  "ab*": 和ab{0,}同義,匹配以a開頭,後面可以接0個或者N個b組成的字串("a", "ab", "abbb", 等);
  "ab+": 和ab{1,}同義,同上條一樣,但最少要有一個b存在 ("ab", "abbb", 等.);
  "ab?":和ab{0,1}同義,可以沒有或者只有一個b;
  "a?b+$": 匹配以一個或者0個a再加上一個以上的b結尾的字串.
  要點, '*', '+',和 '?'只管它前面那個字元.


  你也可以在大括號裡面限制字元出現的個數,比如

  "ab{2}": 要求a後面一定要跟兩個b(一個也不能少)("abb");
  "ab{2,}": 要求a後面一定要有兩個或者兩個以上b(如"abb", "abbbb", 等.);
  "ab{3,5}": 要求a後面可以有2-5個b("abbb", "abbbb", or "abbbbb").

  現在我們把一定幾個字元放到小括號裡,比如:
  "a(bc)*": 匹配 a 後面跟0個或者一個"bc";
  "a(bc){1,5}": 一個到5個 "bc."

  還有一個字元 '│', 相當於OR 操作:

  "hi│hello": 匹配含有"hi" 或者 "hello" 的 字串;
  "(b│cd)ef": 匹配含有 "bef" 或者 "cdef"的字串;
  "(a│b)*c": 匹配含有這樣多個(包括0個)a或b,後面跟一個c 的字串;

  一個點('.')可以代表所有的單一字元,不包括"\n"

  如果,要匹配包括"\n"在內的所有單個字元,怎麼辦?
  對了,用'[\n.]'這種模式.

  "a.[0-9]": 一個a加一個字元再加一個0到9的數字
  "^.{3}$": 三個任意字元結尾 .

  中括號括住的內容只匹配一個單一的字元

  "[ab]": 匹配單個的 a 或者 b ( 和 "a│b" 一樣);
  "[a-d]": 匹配'a' 到'd'的單個字元 (和"a│b│c│d" 還有 "[abcd]"效果一樣); 一般我們都用[a-zA-Z]來指定字元為一個大小寫英文
  "^[a-zA-Z]": 匹配以大小寫字母開頭的字串
  "[0-9]%": 匹配含有 形如 x% 的字串
  ",[a-zA-Z0-9]$": 匹配以逗號再加一個數字或字母結尾的字串

  你也可以把你不想要得字元列在中括號裡,你只需要在總括號裡面使用'^' 作為開頭 "%[^a-zA-Z]%" 匹配含有兩個百分號裡面有一個非字母的字串.

  要點:^用在中括號開頭的時候,就表示排除括號裡的字元


  為了PHP能夠解釋,你必須在這些字元面前後加'',並且將一些字元轉義.
  不要忘記在中括號裡面的字元是這條規路的例外—在中括號裡面, 所有的特殊字元,包括(''), 都將失去他們的特殊性質 "[*\+?{}.]"匹配含有這些字元的字串.
  還有,正如regx的手冊告訴我們: "如果列表裡含有 ']', 最好把它作為列表裡的第一個字元(可能跟在'^'後面). 如果含有'-', 最好把它放在最前面或者最後面, or 或者一個範圍的第二個結束點[a-d-0-9]中間的‘-’將有效.
  看了上面的例子,你對{n,m}應該理解了吧.要注意的是,n和m都不能為負整數,而且n總是小於m. 這樣,才能 最少匹配n次且最多匹配m次. 如"p{1,5}"將匹配 "pvpppppp"中的前五個p
  下面說說以\開頭的
  \b 書上說他是用來匹配一個單詞邊界,就是...比如've\b',可以匹配love裡的ve而不匹配very裡有ve
  \B 正好和上面的\b相反.例子我就不舉了
  好,我們來做個應用:
  如何構建一個模式來匹配 貨幣數量 的輸入
  構建一個匹配模式去檢查輸入的資訊是否為一個表示money的數字。我們認為一個表示money的數量有四種方式: "10000.00" 和 "10,000.00",或者沒有小數部分, "10000" and "10,000". 現在讓我們開始構建這個匹配模式:
  ^[1-9][0-9]*$
  這是所變數必須以非0的數字開頭.但這也意味著 單一的 "0" 也不能通過測試. 以下是解決的方法:
  ^(0│[1-9][0-9]*)$
  "只有0和不以0開頭的數字與之匹配",我們也可以允許一個負號在數字之前:
  ^(0│-?[1-9][0-9]*)$
  這就是: "0 或者 一個以0開頭 且可能 有一個負號在前面的數字." 好了,現在讓我們別那麼嚴謹,允許以0開頭.現在讓我們放棄負號 , 因為我們在表示錢幣的時候並不需要用到. 我們現在指定 模式 用來匹配小數部分:
  ^[0-9]+(\.[0-9]+)?$

  這暗示匹配的字串必須最少以一個阿拉伯數字開頭. 但是注意,在上面模式中 "10." 是不匹配的, 只有 "10" 和 "10.2" 才可以. (你知道為什麼嗎)
  ^[0-9]+(\.[0-9]{2})?$
  我們上面指定小數點後面必須有兩位小數.如果你認為這樣太苛刻,你可以改成:
  ^[0-9]+(\.[0-9]{1,2})?$
  這將允許小數點後面有一到兩個字元. 現在我們加上用來增加可讀性的逗號(每隔三位), 我們可以這樣表示:
  ^[0-9]{1,3}(,[0-9]{3})*(\.[0-9]{1,2})?$
  不要忘記 '+' 可以被 '*' 替代 如果你想允許空白字串被輸入話 (為什麼?). 也不要忘記反斜杆 ’\’ 在php字串中可能會出現錯誤 (很普遍的錯誤).

  現在,我們已經可以確認字串了, 我們現在把所有逗號都去掉 str_replace(",", "", $money) 然後在把型別看成 double然後我們就可以通過他做數學計算了.

  再來一個:
  構造檢查email的正則表示式
  在一個完整的email地址中有三個部分:
  1. 使用者名稱 (在 '@' 左邊的一切),
  2.'@',
  3. 伺服器名(就是剩下那部分).
  使用者名稱可以含有大小寫字母阿拉伯數字,句號 ('.'), 減號('-'), and 下劃線 ('_'). 伺服器名字也是符合這個規則,當然下劃線除外.

  現在, 使用者名稱的開始和結束都不能是句點. 伺服器也是這樣. 還有你不能有兩個連續的句點他們之間至少存在一個字元,好現在我們來看一下怎麼為使用者名稱寫一個匹配模式:

  ^[_a-zA-Z0-9-]+$
  現在還不能允許句號的存在. 我們把它加上:
  ^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*$
  上面的意思就是說: "以至少一個規範字符(除了.)開頭,後面跟著0個或者多個以點開始的字串."

  簡單化一點, 我們可以用 eregi()取代 ereg().eregi()對大小寫不敏感, 我們就不需要指定兩個範圍 "a-z" 和 "A-Z" – 只需要指定一個就可以了:
  ^[_a-z0-9-]+(\.[_a-z0-9-]+)*$
  後面的伺服器名字也是一樣,但要去掉下劃線:
  ^[a-z0-9-]+(\.[a-z0-9-]+)*$
  好. 現在只需要用”@”把兩部分連線:
  ^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$

  這就是完整的email認證匹配模式了,只需要呼叫
  eregi(‘^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$ ’,$eamil)
  就可以得到是否為email了
  正則表示式的其他用法
  提取字串
  ereg() and eregi() 有一個特性是允許使用者通過正則表示式去提取字串的一部分,比如說,我們想從 path/URL 提取檔名 – 下面的程式碼就是你需要:
  ereg("([^\\/]*)$", $pathOrUrl, $regs);
  echo $regs[1];
  高階的代換
  ereg_replace() 和 eregi_replace()也是非常有用的: 假如我們想把所有的間隔負號都替換成逗號:
  ereg_replace("[ \n\r\t]+", ",", trim($str));
  最後,我把另一串檢查EMAIL的正則表示式讓看文章的你來分析一下.
  "^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+'.'@'.'[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.'.'[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$"
  如果能方便的讀懂,那這篇文章的目的就達到了
附加:

正則表示式用於字串處理,表單驗證等場合,實用高效,但用到時總是不太把握,以致往往要上網查一番。我將一些常用的表示式收藏在這裡,作備忘之用。本貼隨時會更新。

匹配中文字元的正則表示式: [\u4e00-\u9fa5]

匹配雙位元組字元(包括漢字在內):[^\x00-\xff]

應用:計算字串的長度(一個雙位元組字元長度計2,ASCII字元計1)

String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}

匹配空行的正則表示式:\n[\s| ]*\r

匹配HTML標記的正則表示式:/<(.*)>.*<\/\1>|<(.*) \/>/

匹配首尾空格的正則表示式:(^\s*)|(\s*$)

String.prototype.trim = function()
{
     return this.replace(/(^\s*)|(\s*$)/g, "");
}

利用正則表示式分解和轉換IP地址:

下面是利用正則表示式匹配IP地址,並將IP地址轉換成對應數值的Javascript程式:

function IP2V(ip)
{
re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g   //匹配IP地址的正則表示式
if(re.test(ip))
{
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
{
throw new Error("Not a valid IP address!")
}
}

不過上面的程式如果不用正則表示式,而直接用split函式來分解可能更簡單,程式如下:

var ip="10.100.20.168"
ip=ip.split(".")
alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))

匹配Email地址的正則表示式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

匹配網址URL的正則表示式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

利用正則表示式去除字串中重複的字元的演算法程式:[注:此程式不正確,原因見紅色字型]

var s="abacabefgeeii"
var s1=s.replace(/(.).*\1/g,"$1")
var re=new RegExp("["+s1+"]","g")
var s2=s.replace(re,"")
alert(s1+s2)   //結果為:abcefgi

===============================
如果var s = "abacabefggeeii"
結果就不對了,結果為:abeicfgg
正則表示式的能力有限


我原來在CSDN上發貼尋求一個表示式來實現去除重複字元的方法,最終沒有找到,這是我能想到的最簡單的實現方法。思路是使用後向引用取出包括重複的字元,再以重複的字元建立第二個表示式,取到不重複的字元,兩者串連。這個方法對於字元順序有要求的字串可能不適用。

得用正則表示式從URL地址中提取檔名的javascript程式,如下結果為page1

s="http://www.9499.net/page1.htm"
s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
alert(s)

利用正則表示式限制網頁表單裡的文字框輸入內容:

用正則表示式限制只能輸入中文:onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"

用正則表示式限制只能輸入全形字元: onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"

用正則表示式限制只能輸入數字:onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

用正則表示式限制只能輸入數字和英文:onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"


相關推薦

1小時學會表示式

想必很多人都對正則表示式都頭疼.今天,我以我的認識,加上網上一些文章,希望用常人都可以理解的表達方式.來和大家分享學習經驗.  開篇,還是得說說 ^ 和 $ 他們是分別用來匹配字串的開始和結束,以下分別舉例說明   "^The": 開頭一定要有"The"字串;   "of despair$": 結尾一定要有"

學會表示式的程式設計如虎添翼

本次我們要討論的專案是正則表示式。很多小夥伴會困惑:正則表示式是專案嗎?你要是問出這樣的問題,說明你太輕視正則表示式啦。學會正則表示式,你的程式設計之路如虎添翼,這麼說一點都不誇張。 什麼是正則表示式? 正則表示式,又稱規則表示式。(英語:Regular Express

願意給我五分鐘,讓我帶掌握表示式嗎?爬蟲必會知識點!

今天小編給大家分享的是Python正則表示式的簡單應用和示例演示,將前面學習的Python正則表示式做一個概括。       進群:548377875  即可獲取大量的零基礎學習資料以及從零基礎到專案實戰的PDF一套哦! &nb

表示式技能提升的方法 持續更新

練習網址:https://alf.nu/RegexGolf 有喜歡正則表示式的朋友可以一起學習。。。 明確指定字串匹配 只輸入一個確定的字串,那麼將會完全匹配該字串 結尾匹配 以啥結尾,k$即以k結尾的字串 另一種方法以什麼結尾匹配 \b表示非字母或

學會表示式,玩弄文字於股掌之中

1950 年, 一位叫 斯蒂芬·科爾·克萊尼的數學家發表了一篇標題為《神經網事件的表示法》的論文,引入了正則表示式的概念。正則表示式就是用來描述他稱為"正則集的代數"的表示式,因此採用"正則表示式"這個術語。 隨後,肯·湯普遜將這一符號系統引入 Unix 中的

為什麼要學會表示式

  一直以來,我都認為能手寫正則表示式的人都是大神,至少不會是坑。正則表示式這個知識領域,在各種語言中被大神們運用的淋漓盡致。作為一個菜雞程式設計師,向大神看齊的最簡單的方式就是寫一手簡單粗暴的正則表示式。   正則表示式是幹什麼的呢?   舉個最簡單的例子,今天下午的時候測試人員給我提了一個bug,並且打上

黑客1分鐘學會window的安全模式,絕密分享!

安全模式是中的一種特殊模式,在安全模式下使用者可以輕鬆地修復系統的一些錯誤,起到事半功倍的效果。有時候機子出問題了可以進安全模式查殺病毒,有時候能夠很有效的解決問題。如何進入。 在啟動計算機時,系統進入Windows啟動畫面前,按下F8鍵(或者在啟動計算機時按住Ctrl鍵),就會出現作業系統多模式啟

java8 手把手學會寫lambda表示式

Java8釋出已經有一段時間了,這次釋出的改動比較大,很多人將這次改動與Java5的升級相提並論。Java8其中一個很重要的新特性就是lambda表示式,允許我們將行為傳到函式中。想想看,在Java8 之前我們想要將行為傳入函式,僅有的選擇就是匿名內部類。Ja

1小時把javaweb部署到騰訊雲上詳細教程(centOS6.6版本,jdk1.7+tomcat8+mysql)

最近想要把自己寫的web專案部署到騰訊雲上進行訪問,但是騰訊雲也不出一個官方的配置教程,像我們這種剛入門的新手完全懵逼。在百度上面搜了很久都沒有詳細的教程,都是在過程中出現各種各樣的問題,所以現在我就把我自己對騰訊雲的配置過程一步步的寫下來,希望大家能夠少走一些彎路。 其實

十分鐘學會表示式

1、正則表示式 正則表示式(regular expression)描述了一種字串匹配的模式,可以用來檢查一個串是否含有某種子串、將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。 模式:使用一種特殊符號來實現字串的匹配 2、建立正則物件 ①隱式建立 var 正則物件

小時學會 ARM 架構

本文來自作者劉盼 在 GitChat 上分享,「閱讀原文」檢視交流實錄 「文末高能」 編輯 | 奕迅 架構的演變歷史 我們首先介紹 ARM Ltd,這裡先說的是公司而不是架構。ARM 的

手把手搞懂JavaScript表示式之方法

咱們來看看JavaScript中都有哪些操作正則的方法。 RegExp RegExp 是正則表示式的建構函式。 使用建構函式建立正則表示式有多種寫法: new RegExp('abc'); // /abc/ new RegExp('abc', 'gi'); // /abc/gi

3分鐘搞定Linux表示式

導讀 正則表示式是一種字元模式,用於在查詢過程中匹配製定的字元。 元字元通常在Linux中分為兩類:Shell元字元,由Linux Shell進行解析; 正則表示式元字元,由vi/grep/sed/awk等文字處理工具進行解析; 正則表示式一般以文字行進行處理,在進

表示式不是一天能學會的!這是我花七天整理的!希望能幫到

一.正則表示式概念 1.定義 正則表示式,又稱規則表示式。(英語:Regular Expression,在程式碼中常簡寫為regex、regexp或RE),電腦科學的一個概念。正則表示式通常被用來檢索、替換那些符合某個模式(規則)的文字。正則表示式(Regular Expression)是一

這20個表示式,讓少寫1,000行程式碼

正則表示式——古老而又強大的文字處理工具。僅用一段簡短的表示式語句,就能快速地實現一個複雜的業務邏輯。掌握正則表示式,讓你的開發效率有一個質的飛躍。 正則表示式經常被用於欄位或任意字串的校驗,比如下面這段校驗基本日期格式的JavaScript程式碼:

知道這20個表示式,能讓少寫1,000行程式碼

正則表示式,一個十分古老而又強大的文字處理工具,僅僅用一段非常簡短的表示式語句,便能夠快速實現一個非常複雜的業務邏輯。熟練地掌握正則表示式的話,能夠使你的開發效率得到極大的提升。 正則表示式經常被用於欄位或任意字串的校驗,如下面這段校驗基本日期格式的JavaScript程式碼: var reg = /^(\

表示式文件邊學邊練,一小時輕鬆學會

最近在做爬蟲,一直很頭疼正則表示式,不會寫也不會認,這次終於下定決心來學習一下,並做一下總結整理。 ​ 到目前為止,正則表示式的功能類似於 常規的Find功能 Java中的 Stri

python—【爬蟲】學習_2(表示式篇)1.基礎知識

一、簡介 正則表示式本身是一種小型的、高度專業化的程式語言,而在python中,通過內嵌整合re模組,程式媛們可以直接呼叫來實現正則匹配。正則表示式模式被編譯成一系列的位元組碼,然後由用C編寫的匹配引擎執行。 r標識代表後面是正則的語句 二、正則表示式中常用的字元含義 1、普通字元和

Jmeter關聯,表示式提取器使用1 Jmeter關聯,表示式提取器使用

Jmeter關聯,正則表示式提取器使用    一、Jmeter關聯的方式:   Jmeter中關聯可以在需要獲取資料的請求上 右鍵-->後置處理器 選擇需要的關聯方式,如下圖有很多種方法可以提取動態變化資料:        二

第4章:介紹python物件型別/4.1 python的核心資料型別/4.2 字串/4.2.4 字串格式化、字串編輯HTML或者XML語法、使用表示式

字串格式化 %s 方式格式化: >>> "%s,abc,%s" %('123','456') '123,abc,456' {數字}方式格式化: >>> "{0},abc,{1}".format('123','456') '123,a