正则表达需要了解的事实
几乎所有的问题都有不止一种解决方案
特殊字符
.(点):匹配任意单个字符,除了换行符。*(星号):匹配前面的表达式零次或多次。+(加号):匹配前面的表达式一次或多次。?(问号):匹配前面的表达式零次或一次。^(脱字符):匹配输入的开始位置。$(美元符号):匹配输入的结束位置。[ ](方括号):定义一个字符集,匹配集合中的任意一个字符。|(竖线):表示或操作,匹配两个表达式之一。\(反斜线):转义字符,用于匹配特殊字符本身。例如,\.可以匹配句点字符。()(圆括号):用于分组,可以对其中的表达式进行捕获或进行其他操作。
[ ](方括号)举例:
自定义举例 [ns]匹配n或者s中的一个
[0-9]:匹配任意一个数字字符。[a-z]:匹配任意一个小写字母字符。[A-Z]:匹配任意一个大写字母字符。[a-zA-Z]:匹配任意一个字母字符(包括大小写)。[a-z0-9]:匹配任意一个小写字母或数字字符。[A-Za-z0-9]:匹配任意一个字母或数字字符(包括大小写)。[!@#$%^&*]:匹配任意一个指定的特殊字符。[a-zA-Z0-9_]:匹配任意一个字母、数字或下划线字符。
取非匹配(排除匹配)
[^0-9]:匹配任意一个非数字字符。[^a-z]:匹配任意一个非小写字母字符。[^A-Z]:匹配任意一个非大写字母字符。[^a-zA-Z]:匹配任意一个非字母字符(包括大小写)。[^a-z0-9]:匹配任意一个非小写字母或数字字符。[^A-Za-z0-9]:匹配任意一个非字母或数字字符(包括大小写)。[^!@#$%^&*]:匹配任意一个非指定的特殊字符。[^a-zA-Z0-9_]:匹配任意一个非字母、数字或下划线字符。
这些例子展示了如何使用取非匹配来排除指定的字符区间。需要注意的是,在取非匹配中,脱字符 ^ 必须放在字符区间[ ]之中
元字符的使用
\.:匹配句点字符本身。\*:匹配星号字符本身。\+:匹配加号字符本身。\?:匹配问号字符本身。\[和\]:匹配方括号字符本身。\{和\}:匹配花括号字符本身。\(和\):匹配圆括号字符本身。\\:匹配反斜线字符本身。
空白元字符
\s:匹配任意空白字符,包括空格、制表符、换行符、回车符等。\t:匹配制表符。\n:匹配换行符。\r:匹配回车符。\f:匹配换页符。\v:匹配垂直制表符。
数字元字符
\d:匹配任意一个数字字符,等效于字符类[0-9]。\D:匹配任意一个非数字字符,等效于字符类[^0-9]。
字母数字元字符
\w:匹配任意一个字母或数字字符(包括下划线)。等效于字符类[a-zA-Z0-9_]。\W:匹配任意一个非字母或数字字符(不包括下划线)。等效于字符类[^a-zA-Z0-9_]。
空白元字符
\s:匹配任意一个空白字符,包括空格、制表符、换行符、回车符等。\S:匹配任意一个非空白字符。
重复匹配
匹配一个或者多个字符
\w+:匹配一个或多个字母、数字或下划线字符。 例如,"abc123","hello_world",都会匹配成功。[a-zA-Z]+:匹配一个或多个英文字母。 例如,"Hello","World",会匹配成功,但是 "123" 不会匹配成功,因为它不包含任何字母。\d+:匹配一个或多个数字字符。 例如,"123","456789",会匹配成功。[aeiou]+:匹配一个或多个元音字母(小写)。 例如,"a","o","eio",都会匹配成功。
匹配0个或者多个字符
.*:匹配任意长度的任意字符,包括空白字符和特殊字符。 例如,"Hello"、"123"、"Hello World!" 都会匹配成功。a.*b:匹配以字母 "a" 开头,以字母 "b" 结尾的字符串,并且两个字母之间可以包含任意长度的字符。 例如,"axyzb"、"abcdefg12345b" 都会匹配成功。.*abc.*:匹配包含 "abc" 子字符串的任意长度的字符串。 例如,"xyzabc123"、"123abc456"、"abcdefg" 都会匹配成功。
匹配0个或者一个字符
要匹配0个或者1个字符,可以使用问号?来实现。 正则表达式中的问号"?"表示前面的元素可选,可以出现0次或者1次。 例如,如果你想匹配字符串中的"a",它可以出现0次或者1次,你可以使用正则表达式a?。
精确匹配
{n}:精确匹配前一个元素n次。{n,}:匹配前一个元素至少n次。{n,m}:匹配前一个元素至少n次但不超过m次
懒惰型元字符
*?:匹配前一个元素0次或尽可能少地匹配1次。+?:匹配前一个元素1次或尽可能少地匹配更多次。??:匹配前一个元素0次或尽可能少地匹配1次。{n,m}?:匹配前一个元素至少n次但不超过m次,尽可能少地匹配。{n,}?:匹配前一个元素至少n次,尽可能少地匹配。
匹配边界
^:匹配字符串的开头。$:匹配字符串的结尾。\b:匹配单词边界位置,即被空白字符(如空格、制表符、换行符)或非单词字符分隔的位置。\B:匹配非单词边界位置,即不在空白字符或非单词字符分隔的位置。(?=...):正向肯定预查,用于匹配满足条件的位置,但不真正消耗字符。(?!...):正向否定预查,用于匹配不满足条件的位置。
\b的用法
var string1 = "Hello world";
var string2 = "Hello_world";
var string3 = "Hello-world";
var pattern = /\bHello\b/;
console.log(pattern.test(string1)); // true
console.log(pattern.test(string2)); // false
console.log(pattern.test(string3)); // false
子表达式
正则表达式中的子表达式(Subexpression)是由括号 () 包围的一组正则表达式元素。 子表达式的主要作用是将一部分正则表达式进行分组,以便对其进行重复、引用或更详细的处理。在匹配过程中,子表达式可以被视为一个独立的单元。 以下是一些示例来说明子表达式的用法:
- 分组和重复:
var string = "abababab";
var pattern = /(ab)+/;
console.log(pattern.test(string)); // true
在上述例子中,(ab)+ 是一个子表达式,将 ab 作为一个整体进行重复匹配。该模式可以匹配重复出现的 ab 序列,因此 pattern.test(string) 的结果为 true。
- 子表达式引用:
var string = "Repeat Repeat"
var pattern = /(\w+)\s+\1/;
console.log(pattern.test(string)); // true
在上述例子中,(\w+) 是一个子表达式,捕获一个或多个连续的单词字符。\s+ 匹配一个或多个空白字符。而 \1 是子表达式的引用,表示重复第一个子表达式的捕获内容。因此,pattern.test(string) 的结果为 true,因为字符串中的 Repeat 被重复出现了两次。
竖线 | 的作用
竖线 | 的作用如下:
- 匹配多个选项:
A|B表示匹配要么是A,要么是B。它会尝试匹配第一个选项A,如果不匹配,则尝试匹配第二个选项B。 - 分组多个选项:
(A|B)将多个选项A和B形成一个组,表示要么是A,要么是B。
以下是一些示例,演示了竖线 | 的使用:
- 匹配多个单词:
var string = "I love cats and dogs.";
var pattern = /cats|dogs/; console.log(pattern.test(string)); // true
在这个例子中,正则表达式 /cats|dogs/ 匹配字符串中的 "cats" 或 "dogs"。如果字符串包含其中任一个单词,pattern.test(string) 将返回 true。
- 分组多个选项:
var string = "It's raining cats and dogs.";
var pattern = /(cats|dogs) and(mice|birds)/;
console.log(pattern.test(string)); // true