
子表达式的作用是把一个表达式中相关的部分组合在一起。用()来定义。常见用途为: a) 对重复次数元字符的作用对象做出精确的设定和控制,例如:(\d{1,3}.){3}\d{1,3}来粗略匹配ip地址 b) 对|操作符的OR条件做出准确的定义。另外子表达式可以嵌套使用、频繁使用子表达式会降低效率
回溯引用允许正则表达式引用前面的匹配结果 应用场景: a) 有一段文本,你想把这段文本中所有连续重复出现的单词找出来。 文本: This is a block of of text, serveral words here are are repeated, and and they should not be. 正则表达式: +(\w+) +\1 结果:匹配出of of, are are, and and 解释: +匹配一个或多个空格,\w+匹配一个单词,\w+是放在()中的,是个子表达式,这里子表达式的作用是将这 一部分单独划分出来供后面引用,\1是一个回溯引用,匹配\w+具体匹配的内容,当(\w+)匹配到of时,\1就是of。 b) 匹配下面html中的标题内容(h1-6标签)
<body>
<h1>welcome to my homepage</h1>
<h2>ColdFusion</h3>
</body>如果使用正则表达式 <h1-6>.*?</h1-6>,那么第二行也会被匹配进去,这很明显不是我们想要的,因为第二行的h2和h3标签不匹配。 我们应该使用<h(1-6)>.*?</h\1>,这样\<h2>ColdFusion\</h3>不会匹配
c) 替换 我们要把一堆电话号码313-555-1234替换成(313)555-1234 文本 313-555-1234 248-555-9999 正则表达式
(\d{3})-(\d{3})-(\d{4})替换 ($1)$2-$3 结果 (313)555-1234 (248)555-9999d) 大小写转换
<p align=center font-size=20px><strong>用来进行大小转换的元字符</strong></p>
元字符 | 说明 |
|---|---|
\l | 把下一个字符转换小写 |
\u | 把下一个字符转换大写 |
\L | 把\L到\E之间的字符转成小写 |
\U | 把\U到\E之间的字符转成大写 |
\E | 结束\L或\U转换 |
例子:把一级标签(\<h1>...\</h1>)的标题文字转换为大写
<body>
<h1>Welcome to my Homepage</h1>
content is divided
<h2>ColdFusion</h2>
</body>正字表达式
(<h1>)(.*?)(</h1>)
替换
$1\U$2\E$3结果
<body>
<h1>WELCOME TO MY HOMEPAGE</h1>
content is divided
<h2>ColdFusion</h2>
</body><font size=4px> 前后查找的作用就是标识位置,而不在匹配结果中出现(不消费)</font>
限定符 | 解释 |
|---|---|
(?=) | 正向前查找 |
(?!) | 负向前查找 |
(?<=) | 正向后查找(有些不支持) |
(?<!) | 负向后查找(有些不支持) |
例子:找出title标签中的内容
<head>
<title>Ben Forta's Homepage</title>
</head>正则:
(?<=<title>).*?(?=</title>) 结果:匹配Ben Forta's Homepage,title标签会自动去掉
相当于在正则中加入if else,很强大但不常用
a) 回溯引用条件 例子:(123)456-9999和123-456-9999都是可接受的电话号码,前面区号要么被()括起来,要么用-隔开; 文本: 123-456-7890 (123)456-7890 (123)-456-7890 (123-456-7890 正则:
(\()?\d{3}(?(1)\)|-)\d{3}-\d{4}结果:匹配1、2行
解释:(()?匹配一个可选的(,我们把它用()括了起来,得到了一个表达式。 随后\d{3}匹配三个数字(即123)。 (?(1))|-)是一个回溯引用,它将根据条件是否得到满足取匹配)或者-(如果(1)存在,)必须被匹配;否则-必须被匹配)
*<font color='red'><b>提示:嵌入了条件的模式看上去往往非常复杂,这意味着调试工作可能也会变得困难。我们可以先对整个模式的各个部分分别进行调试,再把它们拼装到一起。</b></font>
b) 前后查找条件(在实际工作中,往往可以用更简单的办法来达到同样的目的) 例子:匹配邮政编码,一种是12345形式,一种是123456-6789 文本: 11111 22222- 33333-4444 正则:
\d{5}(?(?=-)-\d{4})结果:匹配1、3行 解释:\d{5}匹配前面的5位数字。接下来(?(?=-)-\d{4})是向前查找条件。?=-匹配(但不消费)一个连字符-,如果条件满足(连字符-存在),-\d{4}将匹配那个连字符和紧跟在后的4位数字。这样22222-就被排除在外了,因为它满足条件,但后面的却没有匹配。 更简单的方式:\d{5}(-\d{4})?
<b>总结:?后跟判别式,随后紧跟满足条件下的匹配子串,如果有不满足的子串,则紧跟在|后面。记得用()括起来</b>
1、 表示非换行型空格(non-breaking space)
2、常见的正则表达式
a) IP地址
文本:
localhost is 127.0.0.1
正则:
(((\d{1,2})|(1\d{2})|(2[0-4]\d)|25[0-5]))\.){3}
((\d{1,2})|(1\d{2})|(2[0-4]\d)|25[0-5]))解释:
\d{1,2}匹配0-99,1\d{2}匹配100-199,20-4\d匹配200-249,250-5匹配250-255
b) URL地址
文本:
http://www.baidu.com/blog
https://www.baidu.com
http://localhost:8500/
http://localhost/index.html?a=1&b=32正则:
http[s]?//[-\w.]+(:\d+)?(/([\w/_.]*)?)?结果:
第1、2、3以及第4行到?为止
c) 邮箱地址
(\w+\.)*\w+@(\w\.)+[A-Za-z]+d) html注释
<!-{2,}.*?-{2,}>e) 匹配中文
[\u4e00-\u9fa5]原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。