正则表达式用法简介与速查

  1. 基本元字符

元字符 说明 举例说明
. 匹配任意单个字符(换行符除外) c.t 匹配:全部c和t之间隔一个字符的文本,如:cat, cbt, cct, ...
[] 匹配字符集合中的一个字符 [abc] 匹配:a或b或c
[^] 对字符集合求非 [^abc] 匹配:“非a非b非c”的任意字符
- 定义一个区间 [A-Z] 匹配:字母A,B,C,...,Z中的任意一个字符
\ 对下一个字符转义 须要转义的字符: . [ ] ^ - \ * ? + ! { } $ ( )

 

  2. 特殊元字符

元字符 说明 补充说明
\d 匹配任意一个数字字符 等价于[0-9]
\D \d 的反义,匹配一个任意非数字字符 等价于[^0-9]
\w 匹配任意一个“字母数字下划线”字符 等价于[A-Za-z0-9_]    (最新的实现中可匹配一个汉字)
\W \w 的反义,匹配任意一个“非字母非数字非下划线”字符 等价于[^A-Za-z0-9_]
\f 匹配一个换页符 (属于空白字符)
\n 匹配一个换行符 (属于空白字符)
\r 匹配一个回车符 (属于空白字符)
\t 匹配一个制表符 (属于空白字符)
\v 匹配一个垂直制表符 (属于空白字符)
[\b] 匹配一个退格字符 不经常使用(属于空白字符)
\s 匹配一个空白字符 包括上面的:\f, \n, \r, \t, \v, 注意:不包括[\b]
\S \s 的反义,匹配任意一个非空白字符, 非 \f, \n, \r, \t, \v, 的任意字符
\cx 匹配一个控制字符 不经常使用,x为一个字母,用来表示特定的控制符。如:\cM 匹配 Control-M或回车符
\xn 用一个ASCII字符的十六进制值去匹配这个ASCII字符 不经常使用,n为十六进制数表示
\0n 用一个ASCII字符的八进制值去匹配这个ASCII字符 不经常使用,n为八进制数表示

 

  3. 次数元字符

元字符 说明 举例说明
* 匹配前一个字符(或子表达式)的 0 次或 屡次重复 cat* 匹配:ca, cat, catt, cattt, ...
+ 匹配前一个字符(或子表达式)的 1 次或 屡次重复 cat+ 匹配:cat, catt, cattt, ...
? 匹配前一个字符(或子表达式)的 0 次或 1 次重复 cat? 匹配:ca, cat
{n} 匹配前一个字符(或子表达式)的 n 次重复 cat{3} 匹配:cattttt
{n, } 匹配前一个字符(或子表达式)的至少 n 次重复 cat{3,} 匹配:cattt, catttt, cattttttt, ...
{n, m} 匹配前一个字符(或子表达式)的 至少 n 次且至多 m 次重复 cat{3,5} 匹配:cattt, catttt, cattttt
*? * 的懒惰版本 cat*? 懒惰匹配:t 的 0 次或 屡次重复
+? + 的懒惰版本 cat+? 懒惰匹配:t 的 1 次或 屡次重复
{n, }? {n, } 的懒惰版本 cat{3,} 懒惰匹配:t 的至少 3 次重复

 

  4. 位置元字符

元字符 说明 补充说明
\b 匹配单词的边界 \b 的判断依据是:位置两边分别为 \w 和 \W
\B \b 的反义,匹配非边界 \B 的判断依据是:位置两边同为 \w 或同为 \W
\< 匹配单词的开头 (扩展的正则表达式,egrep支持)
\> 匹配单词的结束 (扩展的正则表达式,egrep支持)
^ 匹配字符串的开头 通常将整段文本视为一个字符串,能够和分行匹配模式组合使用
$ 匹配字符串的结尾 通常将整段文本视为一个字符串,能够和分行匹配模式组合使用
\A 匹配字符串的开头 同 ^,但不受分行匹配影响
\z 匹配字符串的结尾 同 $,但不受分行匹配影响
(?m) 分行匹配模式 (不少正则表达式实现不支持)

 

  5. 子表达式与回溯

元字符 说明 补充说明
() 定义一个子表达式 子表达式在一些文档中有时也称为 pattern(模式)
| 逻辑或操做 通常用在子表达式内,如:(ab|cd) 表示匹配 ab 或 cd
\1 匹配第1个子表达式 \1 表示左起第1个子表达式,\2 表示第2个子表达式,依此类推
?(n) 条件回溯(if then) 若是第n个子表达式中的内容存在,则匹配判断条件以后的内容
?(n)| 条件回溯(if then else) 相似上面,then 要执行的内容与 else 要执行的内容之间,用 | 隔开。

 

  6. 先后查找

元字符 说明 举例说明
(?=) 向前查找(原字符串中,真正匹配内容在前面,条件在后面) \d+(?=a) 匹配:以 a 结尾的数字,但 a 自己不在返回文字中
(?<=) 向后查找(原字符串中,真正匹配内容在后面,条件在前面) (?<=a)\d+ 匹配:以 a 开头的数字,但 a 自己不在返回文字中
(?!) 负向前查找(将向前查找的“=”换成“!”) 向前查找的否认形式,\d+(?!a) 匹配:不以 a 结尾的数字,
(?<!) 负向后查找(将向后查找的“=”换成“!”) 向后查找的否认形式,(?<!a)\d+ 匹配:不以 a 开头的数字,

 

  7. 经常使用正则表达式示例

IP地址 (((\d{1,2})|(1\d{1,2})|(2[0-4]\d)|(25[0-5]))\.){3} ((\d{1,2})|(1\d{1,2})|(2[0-4]\d)|(25[0-5]))
Email地址 (\w+\.)*\w+@(\w+\.)+[A-Za-z]+
URL地址 https?://[-\w\.]+(:\d+)?(/([\w/_.]*)?)?
HTML注释 <!-{2,}.*?-{2,}>
Js注释 //.*
验证整数 ^-?\d+$
验证非负整数 ^\d+$
验证正整数 ^\+?[1-9]\d*$ 
验证浮点数 ^(-?\d+)(\.\d+)?$ 
匹配unicode汉字 [\u4e00-\u9fa5]  (不包括中文标点符号)

 

  8. Python 中使用正则表达式的方法及示例

点击标题,跳转到下文详细说明。javascript

 

  9. JavaScript 中使用正则表达式的方法及示例

点击标题,跳转到下文详细说明。html

 

 

 

1. 基本元字符用法简单说明

(1) 匹配单个字符java

示例文本python

sales1.xls, a1.txt, sales2.xls, sales3.xls, a2.xls

正则表达式正则表达式

sales.

匹配结果数组

sales1.xls, a1.txt, sales2.xls, sales3.xls, a2.xls

解释:函数

匹配以“sales”开头,后跟任意一个字符的6字符组合。ui

 

(2) 使用转义字符spa

示例文本3d

sales1.xls, a1.txt, sales2.xls, sales3.xls, a2.xls

正则表达式

sales.\.xls

匹配结果

sales1.xls, a1.txt, sales2.xls, sales3.xls, a2.xls

解释:

匹配以“sales”开头,后跟任意一个字符,再后以“.xls”结尾的10字符组合。

 

(3) 匹配字符中的某一个

示例文本

a1.txt, b1.txt, c1.txt, d1.txt

正则表达式

[ac]1

匹配结果

a1.txt, b1.txt, c1.txt, d1.txt

解释:

匹配以“a”或“c”开头,后跟字符“1”的2字符组合。

 

(4) 特定字母可大小写

示例文本

The phrase is RegEx or regex, but not regEx.

正则表达式

[Rr]eg[Ee]x

匹配结果

The phrase is RegEx or regex, but not regEx

解释:

匹配 regex,其中第1个字符r大小写皆可,第4个字符e大小写皆可。

 

(5) 定义区间匹配

用法:

[a-z]可匹配全部小写字母,[A-Z]可匹配全部大写字母,[0-9]可匹配全部数字。

注意:若是要匹配全部大小写字母,要写成:[A-Za-z],而不能写成:[A-z](由于其中会包含一些 ASCII符号)。

示例文本

a1.txt, b1.txt c2.txt, d3d.txt, ee.txt

正则表达式

[a-z][0-9].txt

匹配结果

a1.txt, b1.txt, c2.txt, d3d.txt, ee.txt

解释:

匹配:第1个字符为小写字母,第2个字符为数字,最后以“.txt”结尾。

 

(6) 组合使用

示例文本

background-color="#A2A2A2"; color="#000000"

正则表达式

#[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]

匹配结果

background-color="#A2A2A2"; color="#000000"

解释:

对于十六进制数,每位的定义范围为0~9,A,B,C,D,E,F,在上面的正则表达式中使用[A-Fa-f0-9], 重复6次,便可获得一个6位的十六进制数的匹配。(在后面第3小节介绍完次数匹配后,本例有更为简洁的写法。)

 

(7) 取非匹配

示例文本

a1.txt, b2.txt, C3.txt, cc.txt, dd.txt

正则表达式

[a-z][^0-9].txt

匹配结果

a1.txt, b2.txt, C3.txt, cc.txt, dd.txt

解释:

匹配:第1个字符为小写字母,第2个字符不是数字,最后以“.txt”结尾。

 

 

 

 

2. 特殊元字符用法简单说明

(1) 匹配换行

说明:

在Windows下,换行用 \r\n 表示;在Linux下,换行仅用一个 \n 表示。

示例文本(Windows下文本)

001, Tom,  Male
002, Tina, Female

003, Jack, Male

正则表达式

\r\n\r\n

匹配结果

001, Tom,  Male
002, Tina, Female 
                  
003, Jack, Male

解释:

匹配Windows下的2个换行,若是在Linux下,相同匹配的正则表达式可写成:\n\n

 

(2) 匹配数字字符

示例文本

if(testArray[2] == 10) { ... }

正则表达式

testArray\[\d\]

匹配结果

if(testArray[2] == 10) { ... }

解释:

对于数组外的方括号 “[” 和 “]”,要用转义字符,中间的 \d 匹配单个数字字符。

 

(3) 匹配ASCII字符的十六进制值

示例文本

ABCDEABC

正则表达式

\x41

匹配结果

ABCDEABC

解释:

\xn中的n表示ASCII字符的十六进制值,例如ASCII字符 “A” 的ASCII值写成十六进制为0x41, 则 \x41 可匹配文本中的全部 “A” 字符。

 

 

 

3. 次数元字符用法简单说明

 

(1) 匹配 1 次或屡次重复: +

示例文本

The 1st email is to tom@initcircuit.com.
The 2nd email is to jane@cnblogs.com.
The 3rd email is to tim.brown@initcircuit.com.cn.

正则表达式

\w+@\w+.\w+

匹配结果

The 1st email is to tom@initcircuit.com.
The 2nd email is to jane@cnblogs.com.
The 3rd email is to tim.brown@initcircuit.com.cn.

解释:

\w+ 能够有效匹配一个或多个字母数字下划线,因此能匹配出前两个email地址。 但在第3个匹配时有点问题,因为 \w 不包括“.”号,因此第3个email地址的@前面和@后面都只匹配了一部分,解决方案见下条目。

 

(2) 匹配 0 次或屡次重复: *

示例文本

The 1st email is to tom@initcircuit.com.
The 2nd email is to jane@cnblogs.com.
The 3rd email is to tim.brown@initcircuit.com.cn.

正则表达式

\w+[\w\.]*@[\w\.]+\.\w+

匹配结果

The 1st email is to tom@initcircuit.com.
The 2nd email is to jane@cnblogs.com.
The 3rd email is to tim.brown@initcircuit.com.cn.

解释:

能够把上面的正则表达式拆成5部分分别来看:\w+   [\w\.]*    @    [\w\.]+   \.\w+

第1部分的 \w+ 表示必须以字母或数字开头,不能有“.”开头,这部分匹配上面的:tom, jane, tim。

第2部分的 [\w\.]* 表示能够有0个或多个的“字母数字”或“.”号,这部分匹配上面的:.brown。

第3部分的 @ 直接匹配文中的 @。先跳过第4部分,直接看第5部分。

第5部分的 \.\w+ 表示先匹配一个“.”号,后面再跟1个或多个的字母数字,这部分匹配上面的:.com, .com, .cn。

最后看第4部分的 [\w\.]+,表示可匹配一个或多个的字母数字或“.”号,这部分匹配上面的:initcircuit, cnblogs, initcircuit.com。

 

(3) 匹配 0 次或 1 次 重复: ?

示例文本

The URL is http://www.initcircuit.com/, and  https://www.initcircuit.com/.

正则表达式

https?://[\w\./]+/

匹配结果

The URL is http://www.initcircuit.com/, and  https://www.initcircuit.com/.

解释:

正则表达式中的 s? 可匹配 s 的 0 次或 1 次出现。

 

(4) 匹配重复的次数: {n}

示例文本

background-color="#A2A2A2"; color="#000000"

正则表达式

#[0-9A-Fa-f]{6}

匹配结果

background-color="#A2A2A2"; color="#000000"

解释:

匹配一个十六进制位的6次重复。

 

(5) 匹配至少重复的次数: {n,}

示例文本

001: 123.01
002: 52.48
003: 1024.56

正则表达式

\d+: \d{3,}\.\d{2}

匹配结果

001: 123.01
002: 52.48
003: 1024.56

解释:

中间的 \d{3,}\. 匹配:点号前至少有3位数字, 这样就把大于100数字给匹配出来了。

 

(6) 匹配重复次数的区间: {n,m}

示例文本

2018-01-01
99/12/01
3-3-3
03-03-03

正则表达式

\d{2,4}[\-/]\d{1,2}[\-/]\d{1,2}

匹配结果

2018-01-01
99/12/01
3-3-3
03-03-03

解释:

本例用于匹配合法的日期,最前面的\d{2,4}用于匹配年份, 用2位数或4位数表示年份均可以,中间的 [\-/] 表示日期分隔符,“-”或“/”均可以匹配(其中“-”前用了转义符), 后面的 d{1,2} 表示月份,用1位或2位均可以匹配出来。(本例只是展现 {n,m} 的用法,匹配表达式写法并不完美, 后面有匹配日期更好的正则表达式的写法)

 

(7) 防止过分匹配,懒惰型次数匹配符: *?,   +?,   {n,}?

示例文本

The html is <p>abc</p> and <p>def</p>.

正则表达式

<p>.*</p>

匹配结果

The html is <p>abc<p> and <p>def<p>.

解释:

因为正则表达式中间的.*可匹配任意字符的任意屡次重复, 所以把本行的最前面1个<p>和最后的一个</p>中间的内容都一古脑儿地全都匹配了出来, 这不是咱们想要的结果。可以使用 * 的懒惰型版本 *? 来匹配,改进以下:

正则表达式

<p>.*?</p>

匹配结果

The html is <p>abc<p> and <p>def<p>.

解释:

懒惰型版本 *? 在匹配任意次数的重复的字符时,会时时注意其后面的表达式 </p>,若是一旦发现后面的表达式</p>符合匹配条件,本身自己就中止继续匹配了。因此在本例中, 只匹配到</p>以前的部分。

 

 

 

4. 位置元字符用法简单说明

 

(1) 匹配单词边界

示例文本

There is a car on the card.

正则表达式

car

匹配结果

There is a car on the card.

解释:

咱们只想匹配 car,不想匹配后面的 card, 此时须要使用单词边界匹配 \b,改进以下:

正则表达式

\bcar\b

匹配结果

There is a car on the card.

解释:

单词边界匹配符 \b 判断单词边界的依据是: 它的左右两边分别是一个 \w 和 一个 \W。注意:位置元字符 \b 仅匹配位置,其自己并不匹配任何实际出现的字符。 在本例中,car 单词的开头处,其左边是一个空格(即\W),右边是一个字母 c(即\w),符合 \b 的边界判断条件。car 单词的结尾也相似,car 单词结尾处,其左边是一个字母 r(即\w),右边是一个空格(即\W),亦符合 \b 的边界判断条件, 故2个 \b 的中间不分的 car 被匹配出来。

 

(2) 匹配字符串开头与结尾

示例文本

something
<html>
    blablabla
</html>
something else

正则表达式

<html>.*</html>

匹配结果

something
<html>
    blablabla
</html>
something else

解释:

若是咱们但愿,整段文本只有当以<html>开头时才匹配, 若以前有其余内容则不匹配;一样,整段文本只有以</html>结尾时才匹配,以后如有其余内容则不匹配, 此时就须要用到 ^(字符串开头)和 $(字符串结尾)匹配符了。改进以下:

正则表达式

^<html>.*</html>$

匹配结果

something
<html>
    blablabla
</html>
something else

解释:

这样,上面的示例文本就不会有内容被匹配出来了。

 

 

 

5. 子表达式与回溯用法简单说明

 

(1) 子表达式

说明:

前面的“次数元字符”只能匹配1个字符的若干次重复, 若是咱们要匹配一个字符串的若干次重复,就须要用到子表达式。

示例文本

The abcabc can match, but not the abc.

正则表达式

(abc){2}

匹配结果

The abcabc can match, but not the abc.

解释:

子表达式(abc)重复2次能够被匹配出来。

 

(2) 匹配IP地址

示例文本

The IP address is 192.168.1.10.

正则表达式

(\d{1,3}\.){3}\d{1,3}

匹配结果

The IP address is 192.168.1.10.

解释:

子表达式为(\d{1,3}\.),表示1~3位数字后跟一个“.”号, 能够匹配形如:“192.”或“1.”这样的字符模式。以后的 {3} 表示重复3次,便可以把“192.168.1.”匹配出来了。 最后的 \d{1,3} 表示1~3位数字,能够把最后的“.10”匹配出来。固然,这个正则表达式并不完美, 会把超过255的不合理的IP地址也匹配出来,后面的“经常使用正则表达式示例”会有更好的解决方案。

 

(3) 逻辑或的使用

示例文本

1111, 1920, 5279, 2099, 199

正则表达式

(19|20)\d{2}

匹配结果

1111, 1920, 5279, 2099, 199

解释:

这里只匹配以19或20开始的年份,子表达式中使用了“|”号, 匹配19或20,后面的 \d{2} 表示后面再跟2位数字。

 

(4) 子表达式的嵌套

说明:

这里咱们用子表达式的嵌套来解决前面的IP地址的合理性问题。 咱们要找到255及如下的数字,有4种合理状况:(1) 1位或2位数字;(2) 以1开头的3位数字; (3) 以2开头的3位数字,十位为0~4的;(4) 以25开头的3位数字,个位为0~5的。

示例文本

192. 255. 10. 999. 

正则表达式

\b((\d{1,2})|(1\d{1,2})|(2[0-4]\d)|(25[0-5]))\.

匹配结果

192. 255. 10. 999.

解释:

这个嵌套的正则表达式看上去很复杂,其实拆开来看仍是比较简单的:

\b( (\d{1,2}) | (1\d{1,2}) | (2[0-4]\d) | (25[0-5]) )\.

其中,4个黑色文字的子表达式分别表示前述4种状况的匹配, 它们之间用逻辑或并列嵌入到外层的一个子表达式中(红色括号),最前面的 \b 匹配单词边界, 最后的 \. 匹配点号。

 

(5) 回溯引用

说明:

有时咱们想匹配文本中连续出现的2个重复单词,而无论单词内容是什么, 这种需求只能用子表达式的回溯引用来实现。在回溯引用时,若正则表达式中有若干个子表达式, 则 \1 表示从左数起第1个子表达式,\2 表示第2个子表达式,依此类推。 在许多实现里,\0 可用来表明整个正则表达式。

示例文本

There is a white white cat.
The color of of the dog yellow.

正则表达式

\b(\w+)\b[ ]+\1

匹配结果

There is a white white cat.
The color of of the dog yellow.

解释:

正则表达式中,\b(\w+)\b 表示匹配1个单词, [ ]+ 表示匹配其后的1个或多个空格,最后的 \1 就是回溯引用前面的子表达式 (\w+) 中匹配的内容, 若 (\w+) 匹配到 white,则 \1 也去匹配 white;若 (\w+) 匹配到 of,则 \1 也去匹配 of。

 

(6) 利用回溯匹配html配对标签

示例文本

<h1>This line is right.</h1>
<h2>This line is also right.</h2>
<h1>Wrong!!!</h2>

正则表达式

<h([1-6])>.*?</h\1>

匹配结果

<h1>This line is right.</h1>
<h2>This line is also right.</h2>
<h1>Wrong!!!</h2>

解释:

对于<h>标签,其中数字只能配对出现, 故使用回溯子表达式,\1 表示前面子表达式 ([1-6]) 已匹配到的数字。另外,注意这里使用了 *? 懒惰型次数匹配符。

 

(7) 条件回溯

说明:

有时咱们有这种需求,好比在 html 文件中, 咱们想要匹配全部被<span>...</span>包裹的标签。但若是这个<span>被包裹在 <p>...</p>中,则把外层的<p>和</p>标签中的内容也一块儿匹配出来。

示例文本

<body>
<span>something</span>
<p><span>anything</span></p>
<p class="abc"><span>everything</span></p>
</body>

正则表达式

(<p\s*[^>]*>\s*)?<span>.*?</span>(?(1)\s*</p>)

匹配结果

<body>
<span>something</span>
<p><span>anything</span></p>
<p class="abc"><span>everything</span></p>
</body>

解释:

这个正则表达式比较长,须要拆解开来分析:

(<p\s*[^>]*>\s*)? <span>.*?</span> (?(1)\s*</p>)

先看黑体显示的第1个子表达式,这能够匹配: <p>或<p class="abc">,其后的 ? 表示 0 次或 1 次匹配,即<p>标签能够出现1次,也能够没有。

其后的 <span>.*?</span> 部分比较简单, 可匹配<span>标签对及其中的文字内容,注意这里用了懒惰型元字符 *? 匹配 0 个或多个字符。

最后是红色括号中的条件回溯,红字表示,若第1个子表达式有匹配, 则执行匹配后面的 \s*</p>部分,若第1个子表达式没有出现匹配,则后面的 \s*</p>也不做匹配。

 

 

 

6. 先后查找元字符用法简单说明

 

(1) 向前查找(lookahead)

说明:

有时咱们想匹配某种模式以前的内容, 但又不想把这个模式自己给匹配出来,这时可用到前向查找。以下例中,咱们想匹配冒号前的字符, 但又不想把冒号自己给匹配出来。

示例文本

http://www.initcircuit.com/
https://www.initcircuit.com/

正则表达式

.+(?=:)

匹配结果

http://www.initcircuit.com/
https://www.initcircuit.com/

解释:

正则表达式中,.+ 表示匹配1个或多个任意字符,(?=:)为匹配冒号, 但匹配结果仅为冒号前的字符(不包含冒号),这就是“向前查找”的含义。

 

(2) 术语:消费(consume)

说明:

有些正则表达式文档会使用“消费”(consume)这一术语, 表示“匹配且返回文本”的含义。在上面的向前查找(lookahead)中的例子中,冒号被匹配但不在返回文本中, 故称为:不消费。

 

(3) 向后查找(lookbehind)

示例文本

Tom: 80
Jane: 95
Jack: 100

正则表达式

(?<=:\s*)\d+

匹配结果

Tom: 80
Jane: 95
Jack: 100

解释:

本例中,须要匹配冒号后的数字,因此用到了向后查找 (?<=) 元操做符,因为冒号后还有若干个空格, 故用 \s* 予以匹配,但冒号和空格都不出如今匹配结果中, 只出现后面 \d+ 匹配的数字

 

(4) 取反先后查找(negtive lookahead/lookbehind)

说明:

在下面的例子中,要匹配a开头的数字(但只取出数字)很容易, 只要使用普通的“向后查找”就能够了。可是若是要匹配那些不以a开头的纯数字(以下例中的80和95), 就须要用到“取反先后查找”了。

示例文本

Tom's cardnum is a01. His score is 80. Jane's cardnum is a02. Her score is 95.

正则表达式

\b(?<!a)\d+\b

匹配结果

Tom's cardnum is a01. His score is 80. Jane's cardnum is a02. Her score is 95.

解释:

这里的 (?<!a) 就是取反向后查找, 把不是以 a 开头的数字给匹配出来。注意先后使用的 \b 单词边界,若是不用 \b 会把文中的 1 和 2 也匹配出来。

 

 

 

8. Python 中使用正则表达式的方法及示例

 

(1) 概述

Python使用正则表达式须要导入 re 模块,能够直接调用 re的成员函数于对字符串进行正则表达式匹配,也能够经过把正则表达式先编译成一个“正则表达式对象”, 而后使用这个对象进行操做和匹配。这里仅介绍第一种方法。

 

(2) re 的部分经常使用函数

findall(pattern, string [,flags]) 在 string 中匹配 pattern,匹配结果用一列表返回
finditer(pattern, string [,flags]) 同上,但返回一个迭代器
split(pattern, string [,maxsplit = 0]) 根据 pattern 出现的位置拆分 string,返回字符串列表,参数 maxsplit 为最大拆分次数,默认所有拆分。
sub(pattern, repl, string [,count = 0]) 使用 repl 替换 string 中出现的 pattern,返回替换后的新字符串。参数 count 为最大替换次数,默认所有替换。
subn(pattern, repl, string [,count = 0]) 同上,但返回一个元组,其中包含新字符串和替换次数
compile(str [,flags]) 编译正则表达式对象,这里暂不介绍

 

(3) 示例一(将日期匹配出来)

python代码

import re
text = 'The test date is from 2018/1/1 – 2018/12/31'
patt = '(\d{4})/(\d{1,2})/(\d{1,2})'
re.findall(text, patt)

执行结果

[('2018', '1', '1'), ('2018', '12', '31')]

解释:

执行结果为 re.findall 函数返回的匹配结果列表。 因为正则表达式中使用了3个子表达式,故在结果中,把这3个子表达式的匹配结果分开放到了一个元组中。

 

(4) 示例二:将日期格式替换成欧洲格式(即:日/月/年)

python代码

import re
text = 'The test date is from 2018/1/1 – 2018/12/31'
patt = '(\d{4})/(\d{1,2})/(\d{1,2})'
re.sub(patt, r'\3\2\1', text)

执行结果

The test date is from 1/1/2018 - 31/12/2018

解释:

执行结果为 sub.re 函数返回的结果,其中 repl 用到了正则表达式中的子表达式回溯引用表示。

9. JavaScript 中使用正则表达式的方法及示例

 

(1) 概述

在Js中,能够经过 String 对象和 RegEx 对象实现正则表达式处理, 这里仅介绍 String 对象的方法。注意在Js中,正则表达式首尾用两个“/”来括起, 这样可自动生成一个正则表达式对象,而不是双引号或单引号(用引号的话,就是字符串对象了)。

 

(2) String 对象中关于正则表达式的函数

str.search(regexp) 在 String 对象中查找匹配入参正则表达式 regexp,匹配成功则返回在字符串中首次匹配项的索引; 不然返回 -1
str.match(regexp) 在 String 对象中查找匹配正则表达式 regexp,匹配成功则返回一个包含若干匹配信息的 Array(内容详见下例二), 未匹配则返回 null
str.replace(regexp|substr, newSubStr) 将 String 对象内匹配到的 regexp 替换成 newSubStr,返回新字符串,原字符串不变。
str.split(regexp [,limit]) 使用regexp描述的分隔符将一个 String 对象分割成字符串数组。

 

(3) 示例一(search使用)

Js代码

var text = 'The fox, and the dog.';  // 生成1个String对象
var regex = /[^\w\s]/;              // 匹配非字母和非空格
var idx = text.search(regex);
console.log(idx);
console.log(text[idx])

执行结果

> 7
> ","

解释:

search 匹配到的第一个非字母和非空格是“,”, 故返回其索引值:7。

 

(4) 示例二(match使用)

Js代码

var text = 'For more information, see Chapter 3.4.5.1';  
var regex = /see (Chapter \d+(\.\d)*)/;      // 不使用 g 标志
var ary = text.match(regex);
console.log(ary);

执行结果

> ["see Chapter 3.4.5.1", 
"Chapter 3.4.5.1", 
".1"
index: 22,
input: 'For more information, see Chapter 3.4.5.1']

解释:

能够看到返回 Array 中,各个子表达式的匹配。

 

Js代码(regexp使用 g 标志)

var text = 'For more information, see Chapter 3.4.5.1';  
var regex = /see (Chapter \d+(\.\d)*)/g;      // 使用 g 标志
var ary = text.match(regex);
console.log(ary);

执行结果

> ["see Chapter 3.4.5.1"]

解释:

使用 g 标志后,仅将总体匹配结果放入返回 Array 中。

 

(5) 示例三(replace使用)

Js代码

var text = 'The fox, and the dog.';   
var regex = /dog/;               
var newtext = text.replace(regex, 'cat');
console.log(newtext);

执行结果

> The fox, and the cat.

解释:

replace 匹配到 dog 后,用 cat 替换。 新字符串经过返回值返回,原字符串不变。

相关文章
相关标签/搜索