`

正则表达式學習

阅读更多
正則表達式,是用來匹配字符串的一種工具。比如說:要驗證一個電子郵件地址是否合法,要在一個html源文件中找出所有的以<Hn>...</Hn>標識的那部分。還比如在delphi中,我們可以利用支持正則表達式的cxMaskEdit控件來格式化輸入。

一、匹配單個字符
字面匹配
字面匹配就是按原原本本的匹配文字,比如說:
字符串:i have a dream.
正則表達多:rea
那麼被匹配結果是:i have a dream.

任意(任一)匹配
任意匹配就是以含有特定意義的通配符來匹配,就像SQL中的下劃線,它匹配任意一個字符。在正測表達式中,此通配符為半角句點.舉例如下:
字符串:i have a dream.
正則表達式:r.a
那麼被匹配結果是:i have a dream.
說明:如果.匹配任一字符,然只想匹配.本身,方法是在其前面加上右斜線,就如同c語言中的轉義字符,即\.,如前例:
字符串:i have a dream.
正則表達式:\.
那麼被匹配結果是:i have a dream.
像這類的轉意字符還有很多,在後面的部分會有提到。

二、枚舉型匹配
多選一匹配
多選一匹配相當於程序c語言中的枚舉數據類型,它是以方框號來描述的,舉例來說:
字符串:i have a dream,the dream was to be a doctor.
正則表達式:t[hbr]e
那麼匹配結果是:i have a dream,the dream was to be a doctor.

多選一匹配的區間表示
舉例來說:
字符串:
mydoc1.doc
mydoc2.doc
mysheet1.xls
file5.txt
正則表達式:[a-z]c[1-9]\.
那麼匹配結果是:
mydoc1.doc
mydoc2.doc
mysheet1.xls
file5.txt

"Anything But"匹配
意思是除...之外,就是說匹配除了指定字符之外的匹配,表示方法是在表式前加上^,舉例來說:
字符串:
apac1.xls
europe2.xls
sam.xls
正則表達式:[ns]a[^0-9]\.xls
那麼匹配結果是:
europe2.xls
sam.xls
na1.xls


三、元字符
元字符,就是在正則表達式中,用於描述字符的字符,如前面的.,它代表任意一個字符。
再舉例說,前面講到的方括號用於描述枚舉型匹配,那麼如果要表示方括號本身,就需要在其前面加上右斜線,如:
字符串:
var myArray = new Array();
...
if (myArray[0] == 0) {
...
}
正則表達式:myArray\[0\]
匹配結果:
var myArray = new Array();
....
if (myArray[0] == 0) {
...
}

下表列出幾個比較常見的元字符
--------------------
[\b]    退格符
\n 換行符
\r 回車符
\t Tab
\d 數字(等價於[0-9])
\D 非數字(等價於[^0-9])
\w 字母(等價於[a-zA-Z0-9_])
\W 非字母(等價於[^a-zA-Z0-9_])
\s 任意空白字符(等價於[\f\n\r\t\v])
\S 任意非空白字符(等價於[^\f\n\r\t\v])
-----------------------

四、重復匹配
重復匹配就是指匹配多次,下面舉例說明一個多次匹配的例子這個例子匹配文本中所有的電郵地址:
文本:
Send personal email to ben@forta.com. For questions about a book use support@forta.com. Feel free to send unsolicited email to spam@forta.com (wouldn't it be nice if it were that simple, huh?).
正剛表達式:
\w+@\w+\.\w+
匹配結果:
Send personal email to ben@forta.com. For questions about a book use support@forta.com. Feel free to send unsolicited email to spam@forta.com (wouldn't it be nice if it were that simple, huh?).

說明:上面的正則表達式中,+代表其前置內容可重復一或多遍。
與+類似的還有*和?,*代表其前置內容可重復零或多遍,?代表其前置內容可重復零或一遍。

指定重復次數的重復匹配
若要指定重復次數,語法為{n},舉例說明:
文本:
<BODY BGCOLOR="#336633" TEXT="#FFFFFF"
      MARGINWIDTH="0" MARGINHEIGHT="0"
      TOPMARGIN="0" LEFTMARGIN="0">
正則表達式:
#[\d]{6}
匹配結果:
<BODY BGCOLOR="#336633" TEXT="#FFFFFF"
      MARGINWIDTH="0" MARGINHEIGHT="0"
      TOPMARGIN="0" LEFTMARGIN="0">


指定重復次數區間的重復匹配
語法為{n,m}{n,},舉例說明:
文本:
/8/03
10-6-2004
2/2/2
01-01-01
正則表達式:
\d{1,2}[-\/]\d{1,2}[-\/]\d{2,4}
匹配結果:
/8/03
10-6-2004
2/2/2
01-01-01

幾個等價的語法標識
--------------
*   *?
+   +?
{n,}    {n,}?
--------------

五、起止符
單詞起止
看下面這個例子。
文本:
The cat scattered his food all over the room.
正則表達式:
cat
匹配結果:
The cat scattered his food all over the room.

再看下面這個例子。
文本:
The cat scattered his food all over the room.
正則表達式:
\bcat\b
匹配結果:
The cat scattered his food all over the room.

對比以上兩個例子,我們可以看出來\b是一個起止符,表示其前或其後沒有其它非空字符,相當於匹配一個完整的單詞。

再看兩個例子,加深對\b的理解。
文本:
The captain wore his cap and cape proudly as he sat listening to the recap of how his crew saved the men from a capsized vessel.
正則表達式:
\bcat
匹配結果:
The captain wore his cap and cape proudly as he sat listening to the recap of how his crew saved the men from a capsized vessel.

文本:
The captain wore his cap and cape proudly as he sat listening to the recap of how his crew saved the men from a capsized vessel.
正則表達式:
cat\b
匹配結果:
The captain wore his cap and cape proudly as he sat listening to the recap of how his crew saved the men from a capsized vessel.

行起止
如果說想要匹配jave語言代碼一整行單行的注釋,可以參考下面這個例子。
文本:
function doSpellCheck(form, field) {
   // Make sure not empty
   if (field.value == '') {
      return false;
   }
   // Init
   var windowName='spellWindow';
   var spellCheckURL='spell.cfm?formname=comment&fieldname='+field.name;
...
   // Done
   return false;
}
正則表達式:
^\s*//[\n\r]*$
匹配結果:
function doSpellCheck(form, field) {
   // Make sure not empty
   if (field.value == '') {
      return false;
   }
   // Init
   var windowName='spellWindow';
   var spellCheckURL='spell.cfm?formname=comment&fieldname='+field.name;
...
   // Done
   return false;
}
說明:
如前所講,元字符^如果出現在[]中,表示否定,否則表示從行的起始;
元字符$表示至行的結束。

六、SubExpression
SubExpression是子表達式的意思,將正則表達式分層,一個表達式中可以包含子表達式,SubExpression用圓括號()來分隔,()內的表達式作為一個個體來對待,考慮下面這個例子。
文本:
Hello, my name is Ben&nbsp;Forta, and I am the author of books on SQL, ColdFusion, WAP,Windows&nbsp;&nbsp;2000, and other subjects.
正則表達式:
&nbsp;{2}
匹配結果:
Hello, my name is Ben&nbsp;Forta, and I am the author of books on SQL, ColdFusion, WAP,Windows&nbsp;&nbsp;2000, and other subjects.

說明:為什麼會沒匹配到呢?因為{2}只修飾其前一個描述符,也就是;,所以這樣是匹配不到的。但是如果正則表達式是:
(&nbsp;){2}
則匹配結果為:
Hello, my name is Ben&nbsp;Forta, and I am the author of books on SQL, ColdFusion, WAP,Windows&nbsp;&nbsp;2000, and other subjects.

子表達式的嵌套與枚舉
SubExpression是可以嵌套的,看下面這個例子。
假設我們要匹配一段文字中的考試成績,這個成績是百分制的數字,小數位最多只有一位,且必須是0.5,假設文本如下:
小明的考試成績是95.5,小華的考試成績是100,小劉的成績是32,小張的成績是76.3。
正則表達式:
((0|[1-9][\d])(\.5))|(0|[1-9][\d])|100
那麼匹配結果是:
小明的考試成績是95.5,小華的考試成績是100,小劉的成績是32,小張的成績是76.3。

說明:多外並列的多選一的subexpression之間用|隔開,表示或者的意思。


七、前引匹配
請看下面這個例子。
文本:
<H2>Wireless</H2>
Information about Bluetooth, 802.11, and more.
<H2>This is not valid HTML</H3>
正則表達式:
<[hH][1-6]>.*?</[hH][1-6]>
匹配結果:
<H2>Wireless</H2>
Information about Bluetooth, 802.11, and more.
<H2>This is not valid HTML</H3>

很明顯,顯後一行<H2>This is not valid HTML</H3>的匹配結果不是我們想要的,因為它是以<H2>開頭卻以</H3>結尾。
那麼如果要做這一點,正則表達式該如何寫呢?
可以這樣寫:
<[hH]([1-6])>.*?</[hH]\1>
那麼這樣的話,上述例子的匹配結果就是:
<H2>Wireless</H2>
Information about Bluetooth, 802.11, and more.
<H2>This is not valid HTML</H3>

說明:\1表示參照引用前面表達式中的第一個subexpression,如果是\2,就表示參照引用前面表達式中的第二個subexpression.可以看出上述例子中\1參照引用了([1-6]),這個“參照引用”含有一個順序一致的意思,就是說,如果([1-6])匹配的是1,那麼這裡也只能匹配1,如果([1-6])匹配的是2,這裡也只能匹配2。

八、頭尾條件匹配
舉例說文本:
<title>some words</title>
我只想要匹配以<title>開始,並以</title>結束的內容,但匹配的結果不要包含<title>和</title>本身。那麼,正則表達式可以這樣寫:
(?<=<title>).*(?=</title>)
這樣的話匹配結果就是:
<title>some words</title>

說明:?<=後跟著的是匹配的結果的前置內容,?=跟著的是匹配結果的後置內容。而且,如果前置或後置內容是多個字符的話,請用()將其包起來。

相反的情況
好,那麼我們很自然的會想到,我要匹配不以<title>和</title>為起始的內容。這時,用另外兩個語法符號:
(?!)和(?<!)
如下例。
文本:
<title>some words</title>
<body>some words</body>
正則表達式:
(?<!<title>).*(?!</title>)
匹配結果如下:
<title>some words</title>
<body>some words</body>
分享到:
评论

相关推荐

    正则表达式学习工具

    本“正则表达式学习工具”是专为C#初学者和开发者设计的,旨在提供一个方便的环境来学习和测试正则表达式。 首先,我们来了解C#中的正则表达式基础。C#中的正则表达式操作主要通过`System.Text.RegularExpressions`...

    正则表达式学习资料以及练习项目代码很多

    这个压缩包包含了丰富的正则表达式学习资源,适合有一定基础的初学者深入学习。 1. **基础概念** - **模式匹配**:正则表达式定义了一种模式,可以用来匹配符合该模式的字符串。 - **元字符**:如`.`代表任意单个...

    正则表达式学习资料整理

    在这个“正则表达式学习资料整理”中,我们主要探讨的是如何理解和运用正则表达式进行四则运算相关的匹配。 首先,我们需要了解正则表达式的基本构成元素。它们包括: 1. **字符类**:用方括号`[]`定义,如 `[0-9]...

    正则表达式全解及正则表达式学习心得

    正则表达式全解及正则表达式学习心得 正则表达式是字符串模式匹配的强大工具,掌握正则表达式可以让开发者更方便地处理字符串数据。本文将对正则表达式的基本概念、元字符、模式匹配、量词、分组、字符类、边界匹配...

    java正则表达式学习

    【Java正则表达式学习】 Java正则表达式是Java编程语言中用于处理字符串的强大工具,自JDK1.4版本起被引入。它源于PHP并迅速流行,主要用于复杂字符串的验证和处理。正则表达式可以高效地完成对字符串的检查、分割...

    正则表达式学习手册

    ### 正则表达式学习手册知识点总结 #### 1. 引言 正则表达式是一种强大的文本处理工具,能够帮助用户实现字符串的查找、替换等功能。正则表达式的应用场景非常广泛,尤其在编程领域中不可或缺。对于初学者来说,...

    正则表达式学习书PDF

    在"正则表达式学习书PDF"这个资源中,包含两本关于正则表达式的教程: 1. **《正则表达式必知必会》** 这本书通常会深入浅出地介绍正则表达式的概念和用法,包括基本字符类(如字母、数字、空白符)、量词(如*、+...

    正则表达式学习视频

    在正则表达式的简单语法部分,你将学习到: 1. 基本字符匹配:如点号(.)匹配任意单个字符,星号(*)表示前面的元素可以重复零次或多次。 2. 字符集合:使用方括号([])定义一个字符集,如[a-z]匹配所有小写字母。...

    易语言正则表达式学习工具源码

    易语言正则表达式学习工具源码是一款专为学习易语言和正则表达式设计的软件开发资源。正则表达式(Regular Expression)是用于处理字符串的强大工具,它在编程中有着广泛的应用,如文本搜索、替换、数据验证等。...

    正则表达式学习课件PPT

    本课件“正则表达式学习课件PPT”旨在为初学者提供一个基础的正则表达式学习平台,特别地,通过使用C#语言来演示其应用。 首先,我们需要理解正则表达式的基础语法。正则表达式由一系列特殊字符和普通字符组成,...

    正则表达式学习资料

    在这个"正则表达式学习资料"中,我们将深入探讨正则表达式的基本概念、语法以及在Java中的应用。 1. 正则表达式基础: - **模式匹配**:正则表达式是由字符和特殊符号组成的字符串,用于定义一种模式,可以用来...

    正则表达式学习,常用的正则表达式

    正则表达式学习 正则表达式是计算机科学中的一种形式语言,它通过字符串操作来描述、匹配和处理字符串的方式。正则表达式通常用于文本搜索、匹配、替换、筛选等操作。 正则表达式简介 正则表达式的主要功能是对...

    正则表达式 学习 全收集 chm pdf 正则表达式验证工具 exe

    正则表达式 学习 全收集 chm pdf 正则表达式验证工具 exe正则表达式 学习 全收集 chm pdf 正则表达式验证工具 exe正则表达式 学习 全收集 chm pdf 正则表达式验证工具 exe正则表达式 学习 全收集 chm pdf 正则表达式...

    正则表达式学习笔记

    ### 正则表达式学习笔记 #### 一、正则表达式概述 正则表达式是一种强有力的模式匹配工具,广泛应用于各种编程语言中,用于文本处理。正则表达式允许用户定义复杂的查找模式,这对于数据验证、搜索和替换操作特别...

    正则表达式 必知必会 pdf

    它的出版,为程序员和开发人员提供了一本实用性强的正则表达式学习资源。本书基于各种实用场景,从基础的文本匹配开始,逐步深入到回溯引用、条件性求值以及前后查找等高级特性,使得读者能够系统、全面地掌握正则...

    vb正则表达式实例(正则表达式测试程序)

    在VB.NET中,正则表达式...总之,“vb正则表达式实例”是一个实用的工具,它通过图形界面帮助开发者直观地测试和学习正则表达式。了解并熟练掌握正则表达式在VB.NET中的使用,将极大地提升你在文本处理方面的编程能力。

    易语言正则表达式学习工具

    易语言正则表达式学习工具是一款专为学习和实践正则表达式设计的应用程序,它以易语言作为编程基础,提供了友好的用户界面和丰富的功能,帮助初学者和专业人士更好地理解和掌握正则表达式的核心概念。 正则表达式,...

    正则表达式转换工具

    - 工具支持:利用在线正则表达式测试网站,如Regex101,进行实时调试和学习。 综上所述,"正则表达式转换工具"是处理文本数据的强大辅助,它简化了正则表达式的构造过程,使得非专业人士也能方便地利用正则表达式...

    Python基础入门知识之正则表达式学习 正则表达式30分钟入门教程 共21页.pdf

    为了进一步学习,可以查阅Python官方文档的`re`模块,以及各种正则表达式在线教程和练习网站。 通过这个简短的教程,你应该对Python中的正则表达式有了初步的了解。继续实践和探索,将有助于你更好地掌握这一强大...

Global site tag (gtag.js) - Google Analytics