`
junli0411
  • 浏览: 140329 次
  • 来自: ...
社区版块
存档分类
最新评论
阅读更多
正則表達式,是用來匹配字符串的一種工具。比如說:要驗證一個電子郵件地址是否合法,要在一個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>


分享到:
评论

相关推荐

    qt使用正则表达式限制lineEdit的输入,对正则表达式进行了封装,可以直接引入,工程编译正常

    在Qt框架中,正则表达式(Regular Expression)是一种强大的文本处理工具,它允许程序员以结构化的方式匹配、查找、替换或验证字符串。本项目针对Qt的lineEdit组件,通过正则表达式实现了输入限制功能,使得lineEdit...

    正则表达式转换工具

    正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,它用于匹配、查找、替换等操作,涉及字符串处理的各个领域。正则表达式转换工具是专门针对这一需求而设计的,它能帮助用户将输入的内容转换...

    PB实现的正则表达式

    在IT领域,正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,它能够进行复杂的模式匹配、查找、替换等操作。在本话题中,我们将探讨如何使用PowerBuilder 11.5这一经典的开发环境来实现正则...

    易语言正则表达式文本替换

    例如,"子程序_正则文本替换"可能就是一个易语言中用于执行正则表达式替换的子程序,它接收输入的文本、正则表达式模式和替换字符串,然后返回经过替换操作的新文本。 1. **正则表达式基础** - **元字符**:如`.`...

    pb 使用正则表达式源码pbregexp

    标题中的“pb 使用正则表达式源码pbregexp”指的是在PowerBuilder(简称pb)环境中,利用名为“pbregexp”的正则表达式组件来实现源代码级别的正则表达式操作。PowerBuilder是一款流行的可视化的、面向对象的软件...

    易语言正则表达式匹配中文

    在易语言中,正则表达式是进行文本处理、数据提取和搜索的关键工具,尤其在处理中文字符时显得尤为重要。本文将深入探讨易语言中的正则表达式匹配中文的原理、方法以及应用。 正则表达式(Regular Expression)是一...

    C语言正则表达式库

    C语言正则表达式库是用于在C编程环境中处理和匹配正则表达式的软件库。这个库名为PCRE(Perl Compatible Regular Expressions),正如其名,它与Perl语言中的正则表达式语法高度兼容,提供了丰富的功能和强大的匹配...

    Java使用正则表达式提取XML节点内容的方法示例

    Java使用正则表达式提取XML节点内容的方法示例 Java使用正则表达式提取XML节点内容的方法示例主要介绍了Java使用正则表达式提取XML节点内容的方法,结合具体实例形式分析了java针对xml格式字符串的正则匹配相关操作...

    正则表达式调试工具

    正则表达式(Regular Expression,简称regex)是用于在文本中匹配特定模式的强大工具,广泛应用于数据验证、搜索替换和文本处理等领域。正则表达式调试工具是开发人员用来测试和优化这些模式的重要辅助工具。本文将...

    VC、VC++,MFC 正则表达式类库

    正则表达式类库则为VC++和MFC的开发者提供了对正则表达式功能的支持。 "VC、VC++,MFC 正则表达式类库"指的是在MFC中实现或集成的正则表达式处理模块。这个库通常包含一系列的类和函数,允许程序员编写符合特定模式...

    易语言正则表达式类匹配中文

    在易语言中,正则表达式类是一个非常重要的工具,用于处理字符串的模式匹配和查找。在处理中文文本时,这个功能尤为关键,因为中文字符的编码和处理方式与英文有所不同。 正则表达式是用于匹配字符串模式的一种强大...

    Delphi2010正则表达式插件

    《Delphi 2010正则表达式插件详解》 在编程世界中,正则表达式(Regular Expression)是一种强大的文本处理工具,能够帮助开发者高效地进行字符串的匹配、查找、替换等操作。在Delphi 2010这个经典的集成开发环境中...

    正则表达式测试工具C#版(src)

    正则表达式是一种强大的文本处理工具,用于在字符串中进行模式匹配和搜索。在C#编程语言中,正则表达式被广泛应用于数据验证、文本提取、格式转换等多个场景。本项目提供了一个C#编写的正则表达式测试工具,包含完整...

    c++写的正则表达式验证工具

    在IT行业中,正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配、查找、替换等操作。C++作为一种通用编程语言,虽然标准库中没有内置正则表达式支持,但通过第三方库如Boost,我们可以很方便地在...

    通过正则表达式生成数据

    正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,它用于匹配、查找、替换等操作,涉及字符串的模式匹配。在本主题中,我们将深入探讨如何使用正则表达式来生成满足特定条件的随机数据。这在...

    C#正则表达式大全, 判断字符串是否为正整数,中文,英文.....

    C# 正则表达式大全 正则表达式是指用来描述字符串模式的表达式,通过使用正则表达式,我们可以轻松地实现字符串的匹配、验证、提取和替换等操作。在 C# 中,我们可以使用 System.Text.RegularExpressions 命名空间...

    C正则表达式库

    在IT领域,正则表达式库是用于处理字符串匹配、搜索和替换的重要工具。在C语言环境中,GUN(GNU)提供了一个官方的正则表达式库,这使得C程序员可以方便地在他们的应用程序中利用正则表达式的强大功能。本篇文章将...

    易语言正则表达式取网址和名称

    在IT行业中,正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配、查找、替换等操作。在本案例中,“易语言正则表达式取网址和名称”指的是使用易语言这一编程环境,结合正则表达式技术来从文本中...

    正则表达式 必知必会 pdf

    正则表达式作为一种文本处理工具,在计算机编程和数据处理领域中扮演着极其重要的角色。它不仅适用于几乎所有编程语言和计算机平台,而且能够执行复杂的文本搜索、匹配、替换和提取操作。正则表达式的核心是通过定义...

    根据正则表达式生成满足正则的数据

    在IT领域,正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配字符串模式。它们广泛应用于数据验证、搜索、替换等操作。本话题主要关注如何根据正则表达式生成满足该模式的数据,这在测试、数据...

Global site tag (gtag.js) - Google Analytics