正则表达式¶
正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),可以用来描述和匹配字符串的特定模式。
- 正则表达式是一种用于模式匹配和搜索文本的工具。
- 正则表达式提供了一种灵活且强大的方式来查找、替换、验证和提取文本数据。
- 正则表达式可以应用于各种编程语言和文本处理工具中,如 JavaScript、Python、Java、Perl
正则表达式的简介¶
正则表达式的模式可以包括以下内容:
-
字面值字符:例如字母、数字、空格等,可以直接匹配它们自身。
-
特殊字符:例如点号 .、星号 *、加号 +、问号 ? 等,它们具有特殊的含义和功能。
-
字符类:用方括号 [ ] 包围的字符集合,用于匹配方括号内的任意一个字符。
-
元字符:例如 \d、\w、\s 等,用于匹配特定类型的字符,如数字、字母、空白字符等。
-
量词:例如 {n}、{n,}、{n,m} 等,用于指定匹配的次数或范围。
-
边界符号:例如 ^、$、\b、\B 等,用于匹配字符串的开头、结尾或单词边界位置。
字符匹配¶
普通字符¶
普通字符按照字面意义进行匹配,例如匹配字母 "a" 将匹配到文本中的 "a" 字符。
元字符¶
元字符具有特殊的含义,例如:
\d
匹配任意数字字符,等价于 [0-9]\w
匹配任意字母数字字符 , 匹配字母、数字、下划线。等价于 [A-Za-z0-9_].
匹配任意字符(除了换行符)[\s\S]
匹配所有。\s 是匹配所有空白符,包括换行,\S 非空白符,不包括换行。
量词¶
*
:匹配前面的模式零次或多次。+
:匹配前面的模式一次或多次。?
:匹配前面的模式零次或一次。{n}
:匹配前面的模式恰好 n 次。{n,}
:匹配前面的模式至少 n 次。{n,m}
:匹配前面的模式至少 n 次且不超过 m 次。
字符类¶
[ ]
:匹配括号内的任意一个字符。例如,[abc]
匹配字符 "a"、"b" 或 "c"。[^ ]
:匹配除了括号内的字符以外的任意一个字符。例如,[^abc]
匹配除了字符 "a"、"b" 或 "c" 以外的任意字符。
边界匹配¶
^
:匹配字符串的开头。$
:匹配字符串的结尾。\b
:匹配单词边界。\B
:匹配非单词边界。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
分组和捕获¶
( )
:用于分组和捕获子表达式。(?: )
:用于分组但不捕获子表达式。
特殊字符¶
\
:转义字符,用于匹配特殊字符本身。.
:匹配任意字符(除了换行符)。|
:用于指定多个模式的选择。
先行断言(lookahead)和后行断言(lookbehind)¶
(?=pattern)
零宽正向先行断言(zero-width positive lookahead assertion) 代表字符串中的一个位置,紧接该位置之后的字符序列能够匹配 pattern。
例如对 "a regular expression" 这个字符串,要想匹配 regular 中的 re,但不能匹配 expression 中的 re,可以用 re(?=gular),该表达式限定了 re 右边的位置,这个位置之后是 gular,但并不消耗 gular 这些字符。
(?!pattern)
零宽负向先行断言(zero-width negative lookahead assertion)
代表字符串中的一个位置,紧接该位置之后的字符序列不能匹配 pattern。
例如对 "regex represents regular expression" 这个字符串,要想匹配除 regex 和 regular 之外的 re,可以用 re(?!g),该表达式限定了 re 右边的位置,这个位置后面不是字符 g。
负向和正向的区别,就在于该位置之后的字符能否匹配括号中的表达式。
(?<=pattern)
零宽正向后行断言(zero-width positive lookbehind assertion)
代表字符串中的一个位置,紧接该位置之前的字符序列能够匹配 pattern。
例如对 regex represents regular expression 这个字符串,有 4 个单词,要想匹配单词内部的 re,但不匹配单词开头的 re,可以用 (?<=\w)re,单词内部的 re,在 re 前面应该是一个单词字符。
之所以叫后行断言,是因为正则表达式引擎在匹配字符串和表达式时,是从前向后逐个扫描字符串中的字符,并判断是否与表达式符合,当在表达式中遇到该断言时,正则表达式引擎需要往字符串前端检测已扫描过的字符,相对于扫描方向是向后的。
(?<!pattern)
零宽负向后行断言(zero-width negative lookbehind assertion)
代表字符串中的一个位置,紧接该位置之前的字符序列不能匹配 pattern。
例如对 "regex represents regular expression" 这个字符串,要想匹配单词开头的 re,可以用 (?<!\w)re。单词开头的 re,在本例中,也就是指不在单词内部的 re,即 re 前面不是单词字符。当然也可以用 \bre 来匹配。
正则表达式 - 修饰符¶
- i ignore - 不区分大小写
- g global - 全局匹配
- m multi line - 多行匹配
- s 特殊字符圆点 . 中包含换行符 \n
exmple¶
//1
var str="Google runoob taobao runoob";
var n1=str.match(/runoob/); // 查找第一次匹配项
var n2=str.match(/runoob/g); // 查找所有匹配项
//2
var str="Google runoob taobao RUNoob";
var n1=str.match(/runoob/g); // 区分大小写
var n2=str.match(/runoob/gi); // 不区分大小写
//3
<head>
<meta charset="utf-8">
<title>Try</title>
</head>
<body>
<p>单击按钮显示匹配项:</p>
<p id="demo1"></p>
<p id="demo2"></p>
<button onclick="myFunction()">点我</button>
<script>
function myFunction(){
var str="runoobgoogle\ntaobao\nrunoobweibo";
var n1=str.match(/^runoob/g); // 匹配一个
var n2=str.match(/^runoob/gm); // 多行匹配
document.getElementById("demo1").innerHTML=n1;
document.getElementById("demo2").innerHTML=n2;
}
</script>
</body>
</html>
//4
var str="google\nrunoob\ntaobao";
var n1=str.match(/google./); // 没有使用 s,无法匹配\n
var n2=str.match(/runoob./s); // 使用 s,匹配\n
运算符优先级¶
- 转义符
- (), (?:), (?=), [] 圆括号和方括号
- *, +, ?, {n}, {n,}, {n,m} 限定符
- ^, $, \任何元字符、任何字符 定位点和序列(即:位置和顺序)
- | 替换,"或"操作字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。