学习一项技术,首先要了解它的作用,它能做什么
正则表达式作用:
1、测试验证字符串
例如,测试输入的字符串是不是整数,email等格式。
2、查找字符串
根据正则表达式查找到特定的字符串,删除或者替换该字符串。
3、提取字符串
正则表达式的符号
1、普通字符
包括可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。
不可打印字符就是打印显示不出来的,比如,回车符、制表符、换行符等
2、元字符
下表是元字符及其说明
符号 | 说明 |
---|---|
\ | 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,“n”匹配字符“n”。“\n”匹配换行符。序列“\”匹配“\”,“(”匹配“(”。 |
/ | 表示正则表达式的开始或结束,例如:/^\d*$/,正则表达式为两个斜杠之间的内容。 |
^ | 匹配字符串开始的位置的元素 |
$ | 匹配字符串结束的位置的元素 |
* | 匹配前面的字符或者子表达式0次或多次。例如:hel*o,匹配heo、helo、hello |
+ | 匹配前面的字符或者子表达式1次或多次。例如:zo+,匹配zo、zoo |
? | 匹配前面的字符或者子表达式0次或1次。例如:se*d,匹配sd、sed |
{n} | 匹配前面的字符n次。例如:o{2}与food中的两个’o’匹配,不与bob中的’o’匹配 |
{n,} | 匹配前面的字符至少n次 |
{n,m} | 匹配前面的字符,至少 n 次,至多 m 次。例如:o{1,3}匹配boooob中的前3个o,o{0,1}匹配头一个o。注意:您不能将空格插入逗号和数字之间。 |
? | 当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是“非贪心的”。“非贪心的”模式匹配搜索到的、尽可能短的字符串,而默认的“贪心的”模式匹配搜索到的、尽可能长的字符串。例如,在字符串“oooo”中,“o+?”只匹配单个“o”,而“o+”匹配所有“o”。 |
. | 匹配除’\n’以外的任何单个字符。 |
x|y | 匹配x或者y,例如:z|foo匹配’z’或者’foo’,’(z|f)oo’匹配’zoo’或者’foo’。 |
[xyz] | 匹配包含的任一字符,例如:[abc]匹配’play’中的’a’。 |
[^xyz] | 匹配除xyz以外的任一字符,例如:[^abc]匹配’play’中的’p’,’l’,’y’。 |
[a-z] | 字符范围,例如:[a-z]匹配’a’到’z’这个范围内的任一小写字符。 |
[^a-z] | 反向字符范围,[^a-z]匹配’a’到’z’这个范围外的任一小写字符。 |
\b | 匹配一个字边界,即字与空格的位置,例如:er\b匹配’ever’中的’er’,er\b不匹配’every’中的’er’。 |
\B | 非字边界匹配,例如:er\B匹配’every’中的’er’。 |
\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] 等效。 |
\f | 匹配换页符 |
\n | 匹配换行符 |
\r | 匹配回车符 |
\t | 匹配水平制表符 |
\v | 匹配垂直制表符 |
(pattern) | 匹配 pattern 并捕获该匹配的子表达式。可以使用 $0…$9 属性从结果“匹配”集合中检索捕获的匹配。 |
(?:pattern) | 匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配 |
(?=pattern) | 执行正向预测先行搜索的子表达式,通俗点将就是匹配到pattern后,继续向前找,如果这个后面跟着这个pattern格式,就把前面的那个字符拿出来,pattern中的内容不算匹配到的字符,例如:例如,’Windows (?=95|98|NT|2000)’ 匹配“Windows 2000”中的“Windows”,但不匹配“Windows 3.1”中的“Windows”。 |
(?!pattern) | 和上面的正好相反 |
优先级顺序
正则表达式从左到右进行计算,相同优先级的从左到右进行运算,不同优先级的运算先高后低。下面从高到低列出各种运算符的优先级顺序
符号 | 说明 |
---|---|
‘\’ | 转义字符 |
(),(?:),[] | 括号,中括号 |
*,+,?,{n},{n,},{n,m} | 限定符 |
元字符,普通字符 | 任何元字符,普通字符 |
‘|’ | 替换,’或’操作 |
示例
-
英文句点字符匹配(.): . 匹配除\n以外的任何单个字符
-
举例1:abcd,asfd,axyd可以使用/^a.*d$/来匹配
举例2:假如要匹配.,则需要转义,file.txt可以使用/file.txt/来匹配
中括号表达式[]:[]中可以放入一个或多个字符,但是只匹配里面的一个字符
-
举例:/chapter [1234]/匹配chapter 1、chapter 2,不匹配chapter 12,只能匹配出chapter 1,要想匹
配完整的chapter 12,使用/chapter [1234]+/
chapter [1234]也可以使用范围表达式来表示,例如:/chapter [1-4]/等价于/chapter [1234]/
如果想在中括号中包括连字符,使用/[-]/,使用反斜杠转义,也可以放在开始或结尾的位置[-a-z]、[a-z-]
-
限定符:*、+、?、{n}、{n,}、{n,m}
- 举例:/chapter [1-9][0-9]*/ 匹配任何位数的章节;/chapter [1-9][0-9]?/匹配1-99的章节
-
*、+ 和 ? 限定符都被称为“贪心的”,因为它们匹配尽可能多的文本。但是,有时只需要最小的匹配。怎
-
么办,在这些字符后加?号即可解决
-
例如,您可能搜索 HTML 文档,以查找括在 H1 标记内的章节标题。该文本在您的文档中如下:
<H1>Chapter 1 – Introduction to Regular Expressions</H1>
下面的表达式匹配从开始小于符号 (<) 到关闭 H1 标记的大于符号 (>) 之间的所有内容。
/<.*>/匹配整段内容
如果您只需要匹配开始 H1 标记,下面的“非贪心”表达式只匹配
/<.*?>/只匹配
<H1>
通过在 *、+ 或 ? 限定符之后放置 ?,该表达式从“贪心”表达式转换为“非贪心”表达式或者最小匹配。