一、概述
正则表达式一般用于文本内容的查找和替换,在日常工作中还可用来校验用户的输入是否符合自定义的规则。
正则表达式是匹配模式
,要么匹配字符
,要么匹配位置
。
二、基本语法
单个字符 | 数量 | 位置 |
---|---|---|
\d 匹配数字 | * 0 个或者更多 | ^一行的开头 |
\w 匹配 word(数字、字母) | + 1 个或更多,至少 1 个 | $ 一行的结尾 |
\W 匹配「非」word(数字、字母) | ? 0 个或 1 个,一个 Optional | \b 单词"结界"(word bounds) |
\s 匹配 white space(包括空格、tab 等) | {min,max}出现次数在一个范围内 | ( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。 |
\S 匹配「非」white space(包括空格、tab 等) | {n}匹配出现 n 次的 | { 标记限定符表达式的开始。要匹配 {,请使用 {。 |
. 匹配任何,任何的字符 | |指明两项之间的一个选择。要匹配 |,请使用 \| |
「[ ]」 定义一个字符集合
- 0-9、a-z 定义了一个「字符区间」,区间使用 ASCII 码来确定,字符区间在 [ ] 中使用。若没有-连字符,则取的雨元素从[ ]中取
- 「在[]中,特殊字符不需要转义,可以直接使用」
- 「^」 在 [ ] 中是取非操作。
「常见示例:」
- 身份证号(15 位、18 位数字),最后一位是校验位,可能为数字或字符 X:**(^\d15}$)(^\d{18)**
- 数字:**^[0-9]\*$**
- 中文字符的正则表达式:**[\u4e00-\u9fa5]**
- Email 地址:**^\w+([-+.]\w+)\@\w+([-.]\w+)\.\w+([-.]\w+)\*$**
「修饰符」
下表列出了正则表达式常用的修饰符:
修饰符 | 含义 | 描述 |
---|---|---|
i | ignore - 不区分大小写 | 将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。 |
g | global - 全局匹配 | 查找所有的匹配项。 |
m | multi line - 多行匹配 | 使边界字符 「^」 和 「$」 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。 |
s | 特殊字符圆点 「.」 中包含换行符 「\n」 | 默认情况下的圆点 「.」 是匹配除换行符 「\n」 之外的任何字符,加上 「s」 修饰符之后, 「.」 中包含换行符 \n。 |
「示例」
var str="Google runoob taobao runoob";
var n1=str.match(/runoob/); // 查找第一次匹配项
var n2=str.match(/runoob/g); // 查找所有匹配项
var str="runoobgoogle\ntaobao\nrunoobweibo";
var n1=str.match(/^runoob/g); // 匹配一个
var str="google\nrunoob\ntaobao";
var n1=str.match(/google./); // 没有使用 s,无法匹配\n
var n2=str.match(/runoob./s); // 使用 s,匹配\n
var n2=str.match(/^runoob/gm); // 多行匹配
三、子表达式
使用 「( )」 定义一个子表达式。子表达式的内容可以当成一个独立元素,即可以将它看成一个字符,并且使用 * 等元字符。
子表达式可以嵌套,但是嵌套层次过深会变得很难理解。
「正则表达式」
(ab){2,}
「匹配结果」
ababab
「|」 是或元字符,它把左边和右边所有的部分都看成单独的两个部分,两个部分只要有一个匹配就行。
「正则表达式」
(19|20)\d{2}
「匹配结果」
1. 1900
2. 2010
3. 1020
「应用」
匹配 IP 地址。
IP 地址中每部分都是 0-255 的数字,用正则表达式匹配时以下情况是合法的:
- 一位数字
- 不以 0 开头的两位数字
- 1 开头的三位数
- 2 开头,第 2 位是 0-4 的三位数
- 25 开头,第 3 位是 0-5 的三位数
「正则表达式」
((25[0-5]|(2[0-4]\d)|(1\d{2})|([1-9]\d)|(\d))\.){3}(25[0-5]|(2[0-4]\d)|(1\d{2})|([1-9]\d)|(\d))
「匹配结果」
1. 192.168.0.1
2. 00.00.00.00
3. 555.555.555.555
四、回溯引用
回溯引用使用 「\n」 来引用某个子表达式,其中 n 代表的是子表达式的序号,从 1 开始。它和子表达式匹配的内容一致,比如子表达式匹配到 abc,那么回溯引用部分也需要匹配 abc 。
「应用」
匹配 HTML 中合法的标题元素。
「正则表达式」
\1 将回溯引用子表达式 (h[1-6]) 匹配的内容,也就是说必须和子表达式匹配的内容一致。
<(h[1-6])>\w*?<\/\1>
「匹配结果」
1. <h1>x</h1>
2. <h2>x</h2>
替换
需要用到两个正则表达式。
「应用」
修改电话号码格式。
「文本」
313-555-1234
「查找正则表达式」
(\d{3})(-)(\d{3})(-)(\d{4})
「替换正则表达式」
在第一个子表达式查找的结果加上 () ,然后加一个空格,在第三个和第五个字表达式查找的结果中间加上 - 进行分隔。
($1) $3-$5
「结果」
(313) 555-1234
大小写转换
元字符 | 说明 |
---|---|
\l | 把下个字符转换为小写 |
\u | 把下个字符转换为大写 |
\L | 把\L 和\E 之间的字符全部转换为小写 |
\U | 把\U 和\E 之间的字符全部转换为大写 |
\E | 结束\L 或者\U |
「应用」
把文本的第二个和第三个字符转换为大写。
「文本」
abcd
「查找」
(\w)(\w{2})(\w)
「替换」
$1\U$2\E$3
「结果」
aBCd
五、前后查找
前后查找规定了匹配的内容首尾应该匹配的内容,但是又不包含首尾匹配的内容。
向前查找使用 「?=」 定义,它规定了尾部匹配的内容,这个匹配的内容在 ?= 之后定义。所谓向前查找,就是规定了一个匹配的内容,然后以这个内容为尾部向前面查找需要匹配的内容。向后匹配用 ?<= 定义(注: JavaScript 不支持向后匹配,Java 对其支持也不完善)。
「应用」
查找出邮件地址 @ 字符前面的部分。
「正则表达式」
\w+(?=@)
「结果」
「abc」 @qq.com
对向前和向后查找取非,只要把 = 替换成 ! 即可,比如 (?=) 替换成 (?!) 。取非操作使得匹配那些首尾不符合要求的内容。
六、嵌入条件
回溯引用条件
条件为某个子表达式是否匹配,如果匹配则需要继续匹配条件表达式后面的内容。
「正则表达式」
子表达式 ( \ ( ) 匹配一个左括号,其后的 ? 表示匹配 0 个或者 1 个。 ?(1) 为条件,当子表达式 1 匹配时条件成立,需要执行 ) 匹配,也就是匹配右括号。
(\()?abc(?(1)\))
「结果」
1. (abc)
2. abc
3. (abc
前后查找条件
条件为定义的首尾是否匹配,如果匹配,则继续执行后面的匹配。注意,首尾不包含在匹配的内容中。
「正则表达式」
?(?=-) 为前向查找条件,只有在以 - 为前向查找的结尾能匹配 \d{5} ,才继续匹配 -\d{4} 。
\d{5}(?(?=-)-\d{4})
「结果」
1. 11111
2. 22222-
3. 33333-4444
标签:字符,匹配,入门,正则表达式,文教,查找,str,表达式
From: https://www.cnblogs.com/tangredtea/p/17020418.html