自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳細解說正則表達式

開發(fā) 后端 前端
正則表達式,在計算機科學中,是指一個用來描述或者匹配一系列符合某個句法規(guī)則的字符串的單個字符串。本文將為你介紹正則表達式的使用規(guī)則,希望對你有幫助,一起來看。

正則表達式是由英文詞語regular expression翻譯過來的,就是符合某種規(guī)則的表達式。正則表達式在軟件開發(fā)中應用非常廣泛,例如,找出網(wǎng)頁中的超鏈接,找出網(wǎng)頁中的email地址,找出網(wǎng)頁中的手機號碼,判斷輸入的內(nèi)容是否全部是數(shù)字,是否滿足某種日期格式等等。

可以將正則表達式理解為一種對文字進行模糊匹配的語言,它用一些特殊的符號(稱為元字符)來代表具有某種特征的一組字符以及該組字符重復出現(xiàn)的次數(shù)。例如,對于正則表達式“\d{5}(-\d{4})?”,\d就是一個元字符,它表示一個數(shù)字字符,{5}表示緊靠它前面的元素項連續(xù)重復5次,\d和{5}的組合\d{5}就表示匹配任意連續(xù)的5個數(shù)字字符;-\d{4}匹配的是一個連字號(-)后加上4個任意的數(shù)字,(-\d{4})?表示連字號(-)和后面的4個數(shù)字可有可無。

對于整個正則表達式“\d{5}(-\d{4})?”,表示要么是5個連續(xù)的數(shù)字字符,要么是5個連續(xù)的數(shù)字后加上一個連字號(-)、再加上4個連續(xù)的數(shù)字組成的10個字符。正則表達式中的圓括號除了能將多個元素組合成一個可統(tǒng)一操作的組合項外,它所括起來的表達式部分還成為了一個子匹配(也叫子表達式),也就是說,我們可以用圓括號在一個長的正則表達式中劃分出子表達式。這樣,除了可以得到整個正則表達式的匹配結果外,還可以單獨得到每個子表達式部分所匹配的結果。

要靈活運用正則表達式,必須了解其中各種元字符的功能。元字符從功能上大致分為:限定符、選擇匹配符、分組組合和反向引用符、特殊字符、字符匹配符、定位符。

限定符用于指定其前面的字符或組合項連續(xù)出現(xiàn)多少次,下面是各種限定符及其含義:

  • {n} 規(guī)定前面的元素或組合項的連續(xù)出現(xiàn)n 次
  • {n,} 規(guī)定前面的元素或組合項至少連續(xù)出現(xiàn)n 次
  • {n,m } 規(guī)定前面的元素或組合項至少連續(xù)出現(xiàn)n 次,至多連續(xù)出現(xiàn)m 次
  • + 規(guī)定前面的元素或組合項必須出現(xiàn)一次或連續(xù)多次,等效于 {1,}
  • * 規(guī)定前面的元素或組合項可以出現(xiàn)零次或連續(xù)多次,等效于 {0,}
  • ? 規(guī)定前面的元素或組合項出現(xiàn)零次或一次,等效于 {0,1}

默認情況下,正則表達式使用最長(也叫貪婪)匹配原則。當字符“?”緊隨任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后時,匹配模式變成使用最短(也叫非貪婪)匹配原則。例如,在字符串“fooood”中,“fo+?”只匹配“fo”部分,而“fo+”匹配“foooo”部分。

選擇匹配符就是“|”字符,用于選擇匹配兩個選項之中的任意一個,選擇匹配符的優(yōu)先級低于任意字符,即“|”字符的兩個選項是它兩邊盡可能最大的表達式。例如,“chapter|section 1”匹配的是“chapter”或“section 1”,而不是“chapter 1”或“section 1”。

分組組合符就是將正則表達式中的某一部分內(nèi)容組合起來的符號,反向引用符則是用于匹配前面的分組組合所捕獲到的內(nèi)容。

(pattern) 將圓括號中的pattern部分組合成一個可統(tǒng)一操作的組合項和子匹配,每個捕獲的子匹配項按照它們在正則表達式模式中從左到右出現(xiàn)的順序存儲在緩沖區(qū)中。緩沖區(qū)從1開始編號,最多可存儲99個子匹配捕獲的內(nèi)容。存儲在緩沖區(qū)中的子匹配捕獲的內(nèi)容,可以在編程語言中被檢索,也可以在正則表達式中被反向引用。

\num 匹配編號為num的緩沖區(qū)所保存的內(nèi)容,此處的 num 是一個標識特定緩沖區(qū)的一位或兩位十進制正整數(shù),這種方式稱為子匹配的反向引用。例如,要匹配連續(xù)的5個相同的數(shù)字字符,如55555、11111等,需要使用(\d)\1{4}作為正則表達式文本,\1表示與前面的(\d)所捕獲的內(nèi)容一樣,\1{4}則表示前面的(\d) 所捕獲的內(nèi)容還連續(xù)出現(xiàn)4次。

字符匹配符用于指定該符號部分可以匹配多個字符中的任意一個。

  • […] 匹配方括號中包含的字符集中的任意一個字符,例如,“[abc]”可以與“a”、“b”、“c”三個字符中的任何一個相匹配。
  • [^…] 匹配方括號中未包含的任何字符,例如,“[^abc]”可以匹配“a”、“b”、“c”3個字符之外的任何字符。
  • [a-z] 匹配指定范圍內(nèi)的任何字符,例如,“[1-9]”匹配1~9之間的任何數(shù)字字符。
  • [^a-z] 匹配不在指定的范圍內(nèi)的任何字符。
  • \d 匹配任意一個數(shù)字字符,等效于 [0-9]。
  • \D 匹配任意一個非數(shù)字字符,等效于 [^0-9],為\d的逆運算。
  • \s 匹配任何空白字符,包括空格、制表符、換頁符等,等效于[ \f\n\r\t\v]。
  • \S 匹配任何非空白字符,為\s的逆運算,等效于 [^ \f\n\r\t\v]。
  • \w 匹配任何英文字母和數(shù)字類字符以及下劃線。等效于[A-Za-z0-9_]。
  • \W 匹配任何非英文字母和數(shù)字類字符,但不包括下劃線。為\w的逆運算,等效于[^A-Za-z0-9_]。
  • . 匹配除“\n”之外的任何單個字符,例如,“(.)\1”匹配除“\n”之外的兩個連續(xù)的相同字符。若要匹配包括“\n”在內(nèi)的任意字符,可以使用“[\s\S]”、“[\d\D]”或“[\w\W]”等模式。若要匹配“.”字符本身,需要使用“\.”。

正則表達式中使用多種方式來表示非打印字符和原義字符,這些方式都是以反斜杠字符(\)后緊跟其他轉義字符序列來表示的,其中的一些方式也可以表示普通字符。

  • \xn 匹配ASCII碼值等于n的字符,此處的 n 必須是兩位的十六進制數(shù)。例如,“\x41”匹配字符“A”,顯然用這種方式可以表示所有非打印字符。注意:“\x041”的意義是“\x04”所表示的字符后跟字符“1”。
  • \un 匹配Unicode編碼等于n的字符,此處的n 必須是一個四位的十六進制數(shù)。例如,\u00A9 匹配版權符號(©),[\u4e00-\u9fa5]則匹配任意一個漢字字符。

定位符用于規(guī)定匹配模式在目標字符串中的出現(xiàn)位置。

  • ^ 匹配目標字符串的開始位置,也就是規(guī)定匹配必須發(fā)生在目標字符串的開頭處,^必須出現(xiàn)在正則表達式模式文本的最前面才具有定位符作用。
  • $ 匹配目標字符串的結尾位置,也就是規(guī)定匹配必須發(fā)生在目標字符串的結尾處,$必須出現(xiàn)在正則表達式模式文本的最后面才具有定位符作用。
  • \b 匹配一個字邊界,它包含字與空格間的位置,以及目標字符串的開始和結束位置等。\B 匹配非字邊界。

在正則表達式中用到的一些元字符不再表示它原來的字面意義,如果要匹配這些具有特殊意義的元字符的字面意義,必須使用反斜扛(\)將它們轉義為原義字符,即將反斜杠字符(\)放在它們前面。需要進行轉義的字符有“$”、“(”、“)”、“*”、“+”、“.”、“[”、“]”、“?”、“\”、“/”、“^”、“{”、“}”、“|”。

下面列舉出了一些具有典型意義和用途的正則表達式模式文本:

(1)匹配空行:“^\s*$”

(2)匹配HTML標記:“<(\S+)(\s[^>]*)?>[\s\S]*<\/\1\s*>”。

(3)匹配email地址:“[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+”

(4)匹配兩個相同的相鄰單詞:“\b([a-z]+) \1\b”

(5)匹配IP地址:“^\d{1,2}|1\d\d|2[0-4]\d|25[0-5](\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$”

JavaScript中提供了一個名為RegExp的對象來完成有關正則表達式的操作和功能,每一條正則表達式模式對應一個RegExp對象實例。在JavaScript中,有兩種方式可以創(chuàng)建RegExp對象的實例:

(1)使用RegExp對象的顯示構造函數(shù),語法為:new RegExp("pattern"[,"flags"])

(2)使用RegExp對象的隱式構造函數(shù),采用純粹的文本格式:/pattern/[flags]

pattern部分為要使用的正則表達式模式文本,是必須的。在第一種方式中,pattern部分以JavaScript字符串的形式存在,需要使用雙引號或單引號引起來;在第二種方式中,pattern部分嵌套在兩個“/”字符之間,不能使用引號引起來。flags部分設置正則表達式模式的標志信息,是可選的,可以是以下標志字符的組合:

  • g 用作全局標志。如果設置了g這個標志,使用這個正則表達式模式對某個文本執(zhí)行搜索和替換操作時,將對文本中所有匹配的部分起作用。
  • i 用作忽略大小寫標志。如果設置了i這個標志,進行匹配比較時,將忽略大小寫。
  • m 用作多行標志。如果沒有設置m這個標志,那么元字符“^”只與整個被搜索字符串的開始位置相匹配,而元字符“$”只與整個被搜索字符串的結束位置相匹配。如果設置了m這個標志,那么“^”還可以與被搜索字符串中的“\n”或“\r”之后的位置(即下一行的行首)相匹配,而“$” 還可以與被搜索字符串中的“\n”或“\r”之前的位置(即一行的行尾)相匹配。

下面是在javascript程序中應用正則表達式的一些典型案例:

1.將一個字符串中的所有的兩位數(shù)字的十位和個位交換:

 

  1. <script language="javascript">  
  2. var strSrc = "a12b34c56";  
  3. var re = /\D(\d)(\d)\D/gi;  
  4. var strDest = strSrc.replace(re,"$2$1");  
  5. alert(strSrc + " has been converted into " + strDest);  
  6. </script> 

 

2.使用正則表達式驗證身份證和提取年月日:

說明:身份證要么是15位,要么是18位,前面的每位都為數(shù)字,最后一位可以為字母,從7位到第14位為出生年月。

 

  1. <script language="javascript">  
  2. function verify(idcard){  
  3. var datePattern = new RegExp(  
  4. "^\\d{6}(19\\d{2}|20\\d{2})(0[1-9]|1[0-2])(0[1-9]|[1-2]\\d|3[0-1])(\\d{3})?[\\da-zA-Z]$");  
  5. if(datePattern.test(idcard)){  
  6. alert(idcard + "為有效身份證,出生年月為" 
  7. + RegExp.$1 + "-" + RegExp.$2 + "-" + RegExp.$3);  
  8. }else{  
  9. alert(idcard + "為無效身份證");  
  10. }  
  11. }  
  12. </script> 

 

請輸入身份證:

  1. <input type="text" value="422413191803060318" onblur="verify(this.value)"/> 

 

3.使用正則表達式去掉字符串兩端的所有空格:

說明:javascript中的字符串沒有去掉兩端空格的功能,可以用prototype屬性為String類擴 展一個trim方法,以后的String類都可以使用這個trim方法來去掉兩端的空格了。

 

  1. String.prototype.trim = function(){return this.replace(/^\s+|\s+$/g,"");};  
  2. alert(1 + " aaa ".strip() + 2); 

 

下面是在java程序中應用正則表達式的一些典型案例:

1. 判斷輸入的字符串是否是一個email地址:

 

  1. String content = "z.xx@itcast.cn";  
  2. Pattern p = Pattern.compile(  
  3. "[a-zA-Z0-9_-][\\.a-zA-Z0-9_-]*@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+");  
  4. Matcher m = p.matcher(content);  
  5. boolean b = m.matches();  
  6. System.out.println(content + (b? "是":"不是" ) + "一個有效的Email地址"); 

 

2. 從一篇文檔中提取出所有的email地址:

 

  1. String content = "我的email是z.xx@itcast.cn,你的email是l_h_m@itcast.com.cn";  
  2. Pattern p = Pattern.compile(  
  3. "[a-zA-Z0-9_-][\\.a-zA-Z0-9_-]*@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+");  
  4. Matcher m = p.matcher(content);  
  5. while(m.find()){  
  6. String email = m.group();  
  7. //String email = content.substring(m.start(), m.end());  
  8. System.out.println(email);  

 

3.通過一個正則表達式即可以將字符串“xx”替換成“xxFileName”,還可以將字符串“xx[n]”替換成“xxFileName[n]”:

 

  1. String content = "xx[n]"//改為"xx"試試。  
  2. Pattern p = Pattern.compile("\\[.+\\]$|$");  
  3. Matcher m = p.matcher(content);  
  4. String fileName = m.replaceFirst("FileName$0");  
  5. //String fileName = content.replaceFirst("\\[.+\\]$|$", "FileName$0");  
  6. System.out.println(fileName); 

 

4.從一封html格式的中文簡歷中提取出簡歷人的性別:

說明:性別在簡歷中通常為如下形式:<td …>性別:</td><td …> 男</td>

另外,簡歷中的其他地方也可能出現(xiàn)“男”或“女”,例如,“參觀了女排的訓練”。

 

  1. String content = "<td …>性別:</td><td …> 男</td>…參觀了女排的訓練";  
  2. Pattern p = Pattern.compile("[^\u4e00-\u9fa5]([男女])[^\u4e00-\u9fa5]");  
  3. Matcher m = p.matcher(content);  
  4. if(m.find()){  
  5. System.out.println("應聘者的性別為:" + m.group(1));  

 

總之, 隨著互聯(lián)網(wǎng)的迅速發(fā)展,幾乎所有工具軟件和程序語言都支持正則表達式,所以正則表達式變得越來越強大和易于使用。本文從限定符和定位符等方面介紹了正則表達式,希望對你有幫助,如果有什么問題,希望大家可以指正。

轉載自程序員網(wǎng)校 [ http://www.it315.org/ ]

本文鏈接地址:http://www.it315.org/programjava/222.htm

【編輯推薦】

  1. PHP正則表達式 PHP中的正則函數(shù)
  2. 10個在線正則表達式測試網(wǎng)站推薦
  3. C#中簡單的正則表達式
  4. 6.3.1 正則表達式語法
  5. Python正則表達式中字符串的實際操作方案介紹

 

 

責任編輯:于鐵 來源: 程序員網(wǎng)校
相關推薦

2011-06-16 15:40:28

正則表達式

2011-06-16 16:05:23

正則表達式

2018-09-27 15:25:08

正則表達式前端

2020-09-04 09:16:04

Python正則表達式虛擬機

2024-09-14 09:18:14

Python正則表達式

2010-03-25 18:25:36

Python正則表達式

2021-01-27 11:34:19

Python正則表達式字符串

2009-02-18 09:48:20

正則表達式Java教程

2009-09-16 18:19:34

正則表達式組

2017-05-12 10:47:45

Linux正則表達式程序基礎

2019-07-17 15:45:47

正則表達式字符串前端

2022-03-28 06:19:14

正則表達式開發(fā)

2016-11-10 16:21:22

Java 正則表達式

2022-01-04 11:35:03

Linux Shel正則表達式Linux

2023-09-13 08:12:45

2009-09-16 17:15:57

正則表達式引擎

2012-04-28 15:22:46

PHP

2010-03-01 15:51:59

Python則表達式

2011-07-11 12:33:30

JAVA

2009-08-03 17:27:14

C#正則表達式
點贊
收藏

51CTO技術棧公眾號