js正则表达式笔记

692 阅读4分钟

正则表达式入门规则及语法 笔记

语法

构造函数方法:

regexp = new RegExp("pattern", "flags");  // flags指定修饰符

字面量方法:

regexp = /pattern/; // 没有修饰符
regexp = /pattern/gmi; // 伴随修饰符 g、m 和 i

表达式和字符串方法

表达式 参数 返回值
str.match(regexp) 要匹配的模式的 RegExp Array
str.search(regexp) 要匹配的模式的 RegExp 返回第一个匹配项的位置,如果未找到,则返回 -1
str.replace(arg1, arg2) 子字符串或要替换的模式的 RegExp String
regexp.test(str) regexp:匹配规则,str:要匹配的字符串 Boolean

几个简单的例子:

let str = "I love JavaScript";

let result = str.match(/Java(Script)/g);

alert( result[0] ); // JavaScript
alert( result.length ); // 1
let str = "awesome";
alert( str.search( /om/i ) ); // 4(第一个匹配位置)
// 将连字符替换为冒号
alert( '12-34-56'.replace( /-/g, ":" ) )  // 12:34:56
let str = "I love Eating";
// 这两个测试结果相同
alert( /love/i.test(str) ); // true
alert( str.search(/love/i) != -1 ); // true

修饰符

修饰符 解释
i 不区分大小写: 例如A 和 a 没有区别
g 查找所有的匹配项,而不只是第一个。
m 多行模式
u 开启完整的 unicode 支持
y 粘滞模式

元字符

作为对比,这里分为字符类和反向类:

字符类 描述 反向类 描述
\d “d” 来自 “digit”,数字从 0 到 9 的字符 \D 非数字:除 \d 以外的任何字符
\s “s” 来自 “space”,匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 \S 非空格符号:除 \s 以外的任何字符
\w “w” 来自 “word”,字母或数字或下划线 _ \W 非单字字符:除 \w 以外的任何字符,例如非拉丁字母或空格。
. 点(.)匹配除换行符之外的任何字符
^ 匹配字符串的开始位置
$ 匹配字符串的结束位置
\ 转义字符
\b 词边界(下面详细写)

“m” - 多行模式下的^和$

行的开头^和行的结尾$开启多行模式的行为是相似的,这里仅以行开头为例。

在有多行文本的字符串中,正则表达式/^\d+/gm 将匹配每一行的开头数字:

let str = `1心一意
7上八下
10全十美`;

alert( str.match(/^\d+/gm) ); // 1, 7, 10

没有开启多行模式的情况下,仅仅是第一个数字被匹配到:

let str = `1心一意
7上八下
10全十美`;

alert( str.match(/^\d+/g) ); // 1

词边界\b

有三种不同的位置可作为词边界:

  • 在字符串开头,如果第一个字符是单词字符 \w
  • 在字符串中的两个字符之间,其中一个是单词字符 \w,另一个不是。
  • 在字符串末尾,如果最后一个字符是单词字符 \w

例如,可以在 Hello, Toufa! 中找到匹配 \bToufa\b 的单词,其中 Toufa 是一个独立的单词,而在 Hello, ToufaNongmi! 中则不行。

alert( "Hello, Toufa!".match(/\bHello\b/) ); // Hello
alert( "Hello, Toufa!".match(/\bToufa\b/) );  // Toufa
alert( "Hello, Toufa!".match(/\bHell\b/) );  // null (no match)
alert( "Hello, Toufa!".match(/\bToufa!\b/) ); // null (no match)

alert( "Hello, ToufaNongmi!".match(/\bToufa\b/) ); // null

集合和范围 - 大括号{}、中括号[]

在方括号 […] 中的几个字符或者字符类意味着“搜索给定的字符中的任意一个”。

一个中括号只能匹配一个字符

集合

比如说,[qwe] 意味着查找在 3 个字符 'q'、'w' 或者 'e' 中的任意一个。

范围

方括号也可以包含字符范围

alert( "Reply1988".match(/l[0-9A-F][0-9A-F]/g) ); // ly1

排除范围

除了普通的范围匹配,还有类似 [^…] 的“排除”范围匹配。

  • [^aeyo] —— 匹配任何除了 'a'、'e'、'y' 或者 'o' 之外的字符。
  • [^0-9] —— 匹配任何除了数字之外的字符,也可以使用 \D 来表示。
  • [^\s] —— 匹配任何非空字符,也可以使用 \S 来表示。

捕获组 - 小括号()

  1. 它允许将匹配的一部分作为结果数组中的单独项。
  2. 如果我们将量词放在括号后,则它将括号视为一个整体。
    alert( 'Gogogo now!'.match(/(go)+/i) ); // "Gogogo"
    // 实例email
    let regexp = /[-.\w]+@([\w-]+\.)+[\w-]+/g;
    alert("my@mail.com @ his@site.com.uk".match(regexp)); // my@mail.com, his@site.com.uk

量词 + * ?

n 和 m 为非负整数

量词 描述
{n} 确切的位数
{n,m} 某个范围的位数
{n,} 省略上限的位数
+ 代表“一个或多个”,相当于 {1,}
? 代表“零个或一个”,相当于 {0,1}
* 代表着“零个或多个”,相当于 {0,}

选择(or) |

先上一个例子:

let reg = /pen|apple|pineapple|Pineapples/gi;

let str = "I have a pen,I have an apple,I have a pineapple";

alert( str.match(reg) ); // 'pen', 'apple', 'pineapple'
  1. 方括号: 允许在许多字符中进行选择,例如 gr[ae]y 匹配 gray 或 grey。
  2. 选择符号并非在字符级别生效,而是在表达式级别

例如:

  • gr(a|e)y 严格等同 gr[ae]y
  • gra|ey 匹配 “gra” 或者 “ey”。

前瞻断言 和 后瞻断言

肯定语法 描述 否定语法 描述
前瞻断言 x(?=y) 匹配 x, 仅在后面是 y 的情况。 x(?!y) 匹配 x, 仅在后面不是 y 的情况。
后瞻断言 (?<=y)x 匹配 x, 仅在前面是 y 的情况。 (?<=y)x 匹配 x, 仅在前面不是 y 的情况。

神秘的网址

进入下面网址,把正则复制进去,自动生成图谱,方便理解。

生成正则图谱