正则表达

166 阅读3分钟

正则表达需要了解的事实

几乎所有的问题都有不止一种解决方案

特殊字符

  1. .(点):匹配任意单个字符,除了换行符。
  2. *(星号):匹配前面的表达式零次或多次。
  3. +(加号):匹配前面的表达式一次或多次。
  4. ?(问号):匹配前面的表达式零次或一次。
  5. ^(脱字符):匹配输入的开始位置。
  6. $(美元符号):匹配输入的结束位置。
  7. [ ](方括号):定义一个字符集,匹配集合中的任意一个字符。
  8. |(竖线):表示或操作,匹配两个表达式之一。
  9. \(反斜线):转义字符,用于匹配特殊字符本身。例如,\.可以匹配句点字符。
  10. ()(圆括号):用于分组,可以对其中的表达式进行捕获或进行其他操作。

[ ](方括号)举例:

自定义举例 [ns]匹配n或者s中的一个

  1. [0-9]:匹配任意一个数字字符。
  2. [a-z]:匹配任意一个小写字母字符。
  3. [A-Z]:匹配任意一个大写字母字符。
  4. [a-zA-Z]:匹配任意一个字母字符(包括大小写)。
  5. [a-z0-9]:匹配任意一个小写字母或数字字符。
  6. [A-Za-z0-9]:匹配任意一个字母或数字字符(包括大小写)。
  7. [!@#$%^&*]:匹配任意一个指定的特殊字符。
  8. [a-zA-Z0-9_]:匹配任意一个字母、数字或下划线字符。

取非匹配(排除匹配)

  1. [^0-9]:匹配任意一个非数字字符。
  2. [^a-z]:匹配任意一个非小写字母字符。
  3. [^A-Z]:匹配任意一个非大写字母字符。
  4. [^a-zA-Z]:匹配任意一个非字母字符(包括大小写)。
  5. [^a-z0-9]:匹配任意一个非小写字母或数字字符。
  6. [^A-Za-z0-9]:匹配任意一个非字母或数字字符(包括大小写)。
  7. [^!@#$%^&*]:匹配任意一个非指定的特殊字符。
  8. [^a-zA-Z0-9_]:匹配任意一个非字母、数字或下划线字符。

这些例子展示了如何使用取非匹配来排除指定的字符区间。需要注意的是,在取非匹配中,脱字符 ^ 必须放在字符区间[ ]之中

元字符的使用

  1. \.:匹配句点字符本身。
  2. \*:匹配星号字符本身。
  3. \+:匹配加号字符本身。
  4. \?:匹配问号字符本身。
  5. \[\]:匹配方括号字符本身。
  6. \{\}:匹配花括号字符本身。
  7. \(\):匹配圆括号字符本身。
  8. \\:匹配反斜线字符本身。

空白元字符

  1. \s:匹配任意空白字符,包括空格、制表符、换行符、回车符等。
  2. \t:匹配制表符。
  3. \n:匹配换行符。
  4. \r:匹配回车符。
  5. \f:匹配换页符。
  6. \v:匹配垂直制表符。

数字元字符

  1. \d:匹配任意一个数字字符,等效于字符类 [0-9]
  2. \D:匹配任意一个非数字字符,等效于字符类 [^0-9]

字母数字元字符

  1. \w:匹配任意一个字母或数字字符(包括下划线)。等效于字符类 [a-zA-Z0-9_]
  2. \W:匹配任意一个非字母或数字字符(不包括下划线)。等效于字符类 [^a-zA-Z0-9_]

空白元字符

  1. \s:匹配任意一个空白字符,包括空格、制表符、换行符、回车符等。
  2. \S:匹配任意一个非空白字符。

重复匹配

匹配一个或者多个字符
  1. \w+:匹配一个或多个字母、数字或下划线字符。 例如,"abc123","hello_world",都会匹配成功。
  2. [a-zA-Z]+:匹配一个或多个英文字母。 例如,"Hello","World",会匹配成功,但是 "123" 不会匹配成功,因为它不包含任何字母。
  3. \d+:匹配一个或多个数字字符。 例如,"123","456789",会匹配成功。
  4. [aeiou]+:匹配一个或多个元音字母(小写)。 例如,"a","o","eio",都会匹配成功。
匹配0个或者多个字符
  1. .*:匹配任意长度的任意字符,包括空白字符和特殊字符。 例如,"Hello"、"123"、"Hello World!" 都会匹配成功。
  2. a.*b:匹配以字母 "a" 开头,以字母 "b" 结尾的字符串,并且两个字母之间可以包含任意长度的字符。 例如,"axyzb"、"abcdefg12345b" 都会匹配成功。
  3. .*abc.*:匹配包含 "abc" 子字符串的任意长度的字符串。 例如,"xyzabc123"、"123abc456"、"abcdefg" 都会匹配成功。
匹配0个或者一个字符

要匹配0个或者1个字符,可以使用问号?来实现。 正则表达式中的问号"?"表示前面的元素可选,可以出现0次或者1次。 例如,如果你想匹配字符串中的"a",它可以出现0次或者1次,你可以使用正则表达式a?

精确匹配
  1. {n}:精确匹配前一个元素n次。
  2. {n,}:匹配前一个元素至少n次。
  3. {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)是由括号 () 包围的一组正则表达式元素。 子表达式的主要作用是将一部分正则表达式进行分组,以便对其进行重复、引用或更详细的处理。在匹配过程中,子表达式可以被视为一个独立的单元。 以下是一些示例来说明子表达式的用法:

  1. 分组和重复:
var string = "abababab";
var pattern = /(ab)+/; 
console.log(pattern.test(string)); // true

在上述例子中,(ab)+ 是一个子表达式,将 ab 作为一个整体进行重复匹配。该模式可以匹配重复出现的 ab 序列,因此 pattern.test(string) 的结果为 true

  1. 子表达式引用:
var string = "Repeat Repeat"
var pattern = /(\w+)\s+\1/; 
console.log(pattern.test(string)); // true 

在上述例子中,(\w+) 是一个子表达式,捕获一个或多个连续的单词字符。\s+ 匹配一个或多个空白字符。而 \1 是子表达式的引用,表示重复第一个子表达式的捕获内容。因此,pattern.test(string) 的结果为 true,因为字符串中的 Repeat 被重复出现了两次。

竖线 | 的作用

竖线 | 的作用如下:

  1. 匹配多个选项:A|B 表示匹配要么是 A,要么是 B。它会尝试匹配第一个选项 A,如果不匹配,则尝试匹配第二个选项 B
  2. 分组多个选项:(A|B) 将多个选项 AB 形成一个组,表示要么是 A,要么是 B

以下是一些示例,演示了竖线 | 的使用:

  1. 匹配多个单词:
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

  1. 分组多个选项:
var string = "It's raining cats and dogs.";
var pattern = /(cats|dogs) and(mice|birds)/;

console.log(pattern.test(string)); // true