正则表达式

194 阅读3分钟

正则表达式概念

引用developer 网站的定义: 正则表达式是用于匹配字符串中字符组合的模式。在 JavaScript 中,正则表达式也是对象。这些模式被用于 RegExp 的 exec 和 test 方法,以及 String 的 match、matchAll、replace、search 和 split 方法.

创建正则

  • 字面量- 以//包裹的字符串表达式
    • let reg = /\d/
  • RegExp对象的构造函数
    • let reg = new RegExp('\d')

元字符

元字符是组成正则表达式的基础,组合或者演化,元字符也比较多可以大致做下分类, 便于理解记忆

  • 修饰符
字符 描述
g global全文搜索,即找到所有匹配,而不是在找到第一个之后就停止
i ignore case忽略大小写
m mutiple lines多行搜索
  • 字符类
字符 描述
[...] 字符集合。匹配所包含的任意一个字符
[^...] 匹配未包含的任意字符
\w 小写w 匹配包括下划线的任何单词字符。等价于 “[A-Za-z0-9_]”。
\W 大写W 匹配任何非单词字符。等价于 “[^A-Za-z0-9_]”
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [\f\n\r\t\v]
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
  • 重复
字符 描述
{n,m} 最少匹配 n 次且最多匹配 m 次
{n,} 至少匹配 n 次
{n} 匹配 n 次
? 匹配 0 次或者1次 等价于{0,1}
+ 匹配 1 次或者多次次 等价于{1,}
* 匹配 0 次或者多次次 等价于{0,}
  • 选择,分组,引用
字符 描述
选择,匹配改符号左边或者右边的字表达式,如x
(...) 组合,将积分项组合一个单元,可通过*,+,?,|,符合加以修饰,,并且可以记住这个组合,后续可通过\2,(其中2为代指,可以是数字,指参与计数的左括号的位置)引用使用
(...) 组合,将积分项组合一个单元,可通过*,+,?,|,符合加以修饰,,并且可以记住这个组合,后续可通过\2,(其中2为代指,可以是数字,指参与计数的左括号的位置)引用使用
(?:...) 只组合,但后续不记忆不引用
\n 第n个分组第一次匹配的字符,组是圆括号中的子表达式,组索引是从左到右的括号数,(?:...)形式分组不编码。

举几个简单的例子:

  • “industr(?:y|ies)” 就是一个比 “industry|industries” 更简略的表达式。

  • Windows(?=95|98|NT|2000)” 能匹配 “Windows2000” 中的 “Windows”,但不能匹配 “Windows3.1” 中的 “Windows”。

  • “Windows(?!95|98|NT|2000)” 能匹配 “Windows3.1” 中的 “Windows”,但不能匹配 “Windows2000” 中的 “Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

  • 位置

字符 描述
^ 匹配输入字符串的开始位置,在多行检索中,匹配一行的开头
$ 匹配输入字符串的结尾位置,在多行检索中,匹配一行的结尾
  • 其他
字符 描述
\ 转义字符, 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n” 匹配字符 “n”。“\n” 匹配一个换行符。串行 “\” 匹配 “\” 而 “(” 则匹配 “(”。

正则匹配方法

正则表达式可以被用于 RegExp 的 exec 和 test 方法以及 String 的 match、replace、search 和 split 方法。

正则表达式的方法

方法 描述 用法 返回
exec() 检索字符串中的指定值,如果找到匹配的文本,它返回一个数组(未匹配到则返回 null)。 /\d/.exec('abc123') ["1", index: 3, input: "abc123", groups: undefined]
test() test() 方法检索字符串中的值是否匹配给出的正则规则,返回布尔值 true 或 false。 /\d/.test('abc123') true
match() match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配,返回数组 'abc123'.match(/\d/) ["1", index: 3, input: "abc123", groups: undefined]
search() serch()用于检索字符串中指定的字符串或与正则表达式相匹配的字符串,返回匹配的字符串的起始位置的索引,反之返回 -1,返回位置。 'abc123'.search(/\d/); // 3 3
replace() replace() 方法用于在字符串中用一些字符替换另一些字符或者替换一个与正则表达式匹配的字符串,返回字符串 '12345abcde'.replace(/\d\d/,'*'); // "*345abcde" '12345abcde'.replace(/\d\d/g,'*'); // "**5abcde"
split() split() 将字符串分割成字符串数组,返回数组。 "abcd".split(/b/); // ["a", "cd"] ["a", "cd"]

常见正则解析

  • username /^[a-z0-9_-]{3,16}$/
  • email /^([a-z0-9_.-]+)@([\da-z.-]+).([a-z.]{2,6})$/
  • url /^(https?://)?([\da-z.-]+).([a-z.]{2,6})([/\w .-])/?$/
  • 去除文本首位的空白字符(可扩展)/^\s+/ /\s+$/g /(^\s+)|(\s+$)/g
  • 以指定字符结尾。str.match(/.{2}$/);