正则表达式入门
匹配字符
char
可以直接匹配字符
.
点可以匹配任意字符,而且可以以任意数目出现,如..
,.a.
.而要匹配.本身的字符,则需要用反斜杠(元字符,)进行转义.
匹配一组字符
- 元字符
[]
在这个括号内, 可以定义我们想要搜索的字符集合
举例:
[ns] 枚举想要搜索的字符
[a-z] 按范围搜索字符
[a-zA-Z0-9] 上述两种方式结合
[^0-9] 不匹配括号内的字符
匹配特定的字符类别
- 匹配数字(与非数字)
\d
~ [0-9]
\D
~ [^0-9]
- 匹配字母和数字(与非字母和数字)
\w
~ [a-zA-Z0-9_]
\W
~ [^a-zA-Z0-9_]
重复匹配
匹配一个或多个字符
只需给要匹配的字符加上一个+
字符作为后缀就行了
举例:
a+
将匹配一个或多个连续出现的a
匹配零个或多个字符
使用*
即可
匹配零个或一个字符
使用?
即可
匹配的重复次数
{}
可以设置匹配字符重复的次数
举例: [0-9A-Fa-f]{6}
\d{1,2}
贪婪型元字符和懒惰型元字符
- 贪婪型元字符
*
和+
都是贪婪型元字符
举例:
This offer is not available to customers
living in <B>AK</B> and <B>HI</B>.
若使用<[Bb]>.*</[Bb]>
,则只能找到一个匹配
- 懒惰型元字符
懒惰型元字符就是在贪婪型元字符后面加?
,它会寻找尽可能少的字符.
位置匹配
单词边界
\b
匹配一个单词边界
\B
匹配一个非单词边界
字符串边界
^
开头边界
$
结尾边界
子表达式
子表达式是一个更大的表达式的一部分;把一个表达式划分为一系列子表达式的目的是为了把那些子表达式当作一个独立元素来使用.子表达式必须用()
括起来.
举例:
Hello, my name is Ben Forta, and I am
the author of books on SQL, ColdFusion, WAP,
Windows 2000, and other subjects.
正则表达式:
( ){2,}
-
子表达式允许嵌套
-
或操作符
|
即给定两个元素,匹配其中一个
回溯引用:前后一致匹配
子表达式可以进行回溯引用.
举例:
<BODY>
<H1>Welcome to my Homepage</H1>
Content is divided into two sections:<BR>
<H2>ColdFusion</H2>
Information about Macromedia ColdFusion.
<H2>Wireless</H2>
Information about Bluetooth, 802.11, and more.
<H2>This is not valid HTML</H3>
</BODY>
正则表达式: <[Hh][1-6)>.*?</[Hh][1-6]>
这个表达式可以匹配我们需要的内容,但是也会匹配这一行:
<H2>This is not valid HTML</H3>
这不符合html的标题规范,所以我们需要改进:
正则表达式(改): <[Hh]([1-6])>.*?</[Hh]\1>
这个就可以了,其中\1
表示引用第一个子表达式,以此类推.
回溯在替换操作中的应用
给定一个正则表达式,其子表达式可以在替换操作中使用.
举例:
313-555-1234
248-555-9999
810-555-9000
正则表达式: (\d{3})(-)(\d{3})(-)(\d{4})
替换表达式: ($1) $3-$5
- 替换操作中的大小写转换
元字符 | 说明 |
---|---|
\E | 结束\L或\u转换 |
\l | 把下一个字符全部转换为小写 |
\L | 把\L到\E之间的字符全部转换为小写 |
\u | 把下一个字符转换为大写 |
\U | 把\U到\E之间的字符全部转换为大写 |
举例:
<BODY>
<H1>Welcome to my Homepage</H1>
Content is divided into two sections:<BR>
<H2>ColdFusion</H2>
Information about Macromedia ColdFusion.
<H2>Wireless</H2>
Information about Bluetooth, 802.11, and more.
<H2>This is not valid HTML</H3>
</BODY>
正则表达式: (<[Hh]1>)(.*?)(</[Hh]1>)
替换: $1\U$2\E$3
结果:
<BODY>
<H1>WELCOME TO MY HOMEPAGE</H1>
Content is divided into two sections:<BR>
<H2>ColdFusion</H2>
Information about Macromedia ColdFusion.
<H2>Wireless</H2>
Information about Bluetooth, 802.11, and more.
<H2>This is not valid HTML</H3>
</BODY>
前后查找
有的时候,我们需要的只是这样一个表达式,它包含的匹配本身并不返回,而是用于确定正确的匹配位置,它并不是匹配结果的一部分,换句话说,我们需要进行"前后查找".
向前查找
任何一个子表达式都可以转换为一个向前查找表达式,只要给它加上一个?=
前缀即可.
向后查找
?<=
- 向前查找模式的长度是可变的,它们可以包含.和+之类的元字符,所以它们非常灵活.向后查找模式只能是固定长度——这是一条几乎所有的正则表达式实现都遵守的限制.
对前后查找取非
负向前查找 ?!
负向后查找 ?<!