# 正则表达式急速上手

正则表达式,即 Regular Expressions,缩写为 Regex 或 Regexp,是在正则表达式语法框架内创建的字符串。您可以用正则表达式轻松管理数据,执行查找、匹配或编辑等命令。正则表达式适用于 Python、SQL、JavaScript、R、Google Analytics、Google Data Studio 等编程语言和整个编程过程。

# 基本匹配

我们想要查找的字符或单词可以直接输入,就像搜索一样。例如匹配文本中的 curious:

const str = "I have no special talents. I am only passionately curious.";
const reg = /curious/g;
console.log(str.match(reg)); // ['curious']

# 基础元字符

# .

.. 允许匹配任何字符,包括特殊字符和空格。它可以匹配任何一个单个的字符。

在同一个正则表达式里允许使用多个 . 字符,它们既可以连续出现(一个接着一个如: .. 将匹配任意两个字符),它也可以间隔着出现在模式的不同位置。

如果我们需要匹配 . 本身,则需要在。前面加上一个转义字符 \

const str = "OK. !";
const reg = /./g;
console.log(str.match(reg)); // ['O','K',' ','!']

# []

[][] 表示一个字符集。如果一个词中的字符可以是各种字符,我们就将所有的可选字符写进中括号 [] 中。

例如,为了查找文本中的所有单词,我们需要编写表达式,在 [] 中相邻地输入字符 a、e、i、o、u。

const str = "bar ber bir bor bur";
const reg = /b[aeiou]r/g;
console.log(str.match(reg)); // [ 'bar', 'ber', 'bir', 'bor', 'bur' ]

为了查找指定范围的字母,我们需要将起始字母和结束字母写进 [] 中,中间用连字符 - 分隔。它区分大小写。例如编写一个表达式,匹配 e 和 h 之间所有的小写字母,包括它们本身。

const str = "abcdefghijklmnopqrstuvwxyz";
const reg = /[e-h]/g;
console.log(str.match(reg)); // [ 'e', 'f', 'g', 'h' ]

为了查找指定范围的数字,我们需要在 [] 中输入起始和结束数字,中间用连字符 - 分隔。例如编写一个表达式,匹配 3 到 6 之间的所有数字,包括它们本身。

const str = "0123456789";
const reg = /[3-6]/g;
console.log(str.match(reg)); // [ '3', '4', '5', '6' ]

# ^

^^ 表示取反。正常的匹配模式可以理解为白名单, ^ 就类似于将该字符设为黑名单模式。

为了查找下方文本的所有单词(ber 和 bor 除外),请在 [] 中的 ^ 后面并排输入 e 和 o。

const str = "bar ber bir bor bur";
const reg = /b[^eo]r/g;
console.log(str.match(reg)); // ['bar','bir','bur']

# 重复匹配

# +

++ 表示一个字符可以出现一次或多次。

例如,表示 e 在下方文本中出现一次或多次。

const str = "br ber beer";
const reg = /be+r/g;
console.log(str.match(reg)); // [ 'ber', 'beer' ]

# *

** 表示一个字符完全不匹配或可以匹配多次。

例如,表示字母 e 在下方文本中不出现,只出现 1 次或者并排出现多次。

const str = "br ber beer";
const reg = /be*r/g;
console.log(str.match(reg)); // [ 'br', 'ber', 'beer' ]

# ?

?? 表示一个字符是可选的。

例如,表示下方文本中的字母 u 是可选的。

const str = "color, colour";
const reg = /colo?r/g;
console.log(str.match(reg)); // [ 'color' ]

# {}

{}{} 表示一个字符出现的次数,我们在该字符的末尾,将它出现的次数写进大括号 {} 中。

如 {n}。例如,表示下方文本中的字母 e 只能出现 2 次。

const str = "ber beer beeer beeeer";
const reg1 = /be{2}r/g;
console.log(str.match(reg1)); // [ 'beer' ]
// 利用 {} 限定字符可以出现次数的范围
const reg2 = /be{2,4}/g;
console.log(str.match(reg2)); // [ 'beer', 'beeer', 'beeeer' ]
// 可以利用 {} 限定该字符至少应该出现几次,只需要在区间数字的后一位留空
const reg3 = /be{3,}r/g;
console.log(str.match(reg3));// [ 'beeer', 'beeeer' ]

# 修饰符

# 分组匹配

# ()

()() 可以对一个表达式进行分组,并用这些分组来引用或执行一些规则。本质上它是扩大修饰符的作用域,因为通常情况下修饰字符只会作用于它前一个字符中。

为了给表达式分组,我们需要将文本包裹在 () 中。现在为下方文本中的 haa 构造分组。

const str = "ha-ha,haa-haa";
const reg1 = /(haa)/g;
console.log(str.match(reg1)); // [ 'haa', 'haa' ]
// 除此我们还可以通过引用分组的形式来避免重复书写相同的分组
const reg2 = /(ha)-\1,(haa)-\2/g;
console.log(str.match(reg2)); // [ 'ha-ha,haa-haa' ]

# (?😃

(?: )(?: ) 表示非捕获分组。它对可以表达式进行分组,并确保它不被引用捕获。

例如,下面有两个分组,但我们用 \1 引用的第一个组实际上是指向第二个组,因为第一个是未被捕获的分组。

const str = "ha-ha,haa-haa";
const reg = /(?:ha)-ha,(haa)-\1/g;
console.log(str.match(reg)); // [ 'ha-ha,haa-haa' ]

# |

|| 竖线允许一个表达式包含多个不同的分支。所有分支用 | 分隔。和在字符层面上运作的字符集 [abc] 不同,分支在表达式层面上运作。

例如,下面的表达式同时匹配 cat 和 Cat。在末尾添加另一个 |,并输入 rat 以匹配所有单词。

const str = "cat Cat rat";
const reg = /(C|c)at|rat/g;
console.log(str.match(reg)); // [ 'cat', 'Cat', 'rat' ]

# 位置匹配

# \b

\b\b 表示这个位置的字符是一个能够用于构成单词的字符(字母、数字、下划线,也就是在 \w 范围内的字符)。

例如,匹配 cat 单词,但是不匹配包含 cat 这三个字符的内容。

const str = "The cat scattered his food all over the room";
const reg = /\bcat\b/g;
console.log(str.match(reg)); // [ 'cat' ]

# \B

\B\B 表示这个位置的字符是并非为 \w 范围内的字符,和 \b 取反。

# ^

^^ 放在行首可以定义字符串的开头。

例如:我们用 [0-9] 查找数字,若仅查找行首的数字,可以在表达式前面加上 ^。

const str = `1. 3 eggs, beaten
2. 1 tsp sunflower oil
3. 1 tsp butter`;
const reg = /^[0-9]/gm;
console.log(str.match(reg)); // [ '1', '2', '3' ]

# $

$$ 用于定义字符串的结尾。

我们可以在 html 的后面添加 $ ,来查找仅在行末出现的 html。

const str = `https://domain.com/what-is-html.html
https://otherdomain.com/html-elements
https://website.com/html5-features.html`;
const reg = /html$/gm;
console.log(str.match(reg)); // [ 'html', 'html' ]

最后推荐一个练习网站 RegexLearn

更新于

请我喝[茶]~( ̄▽ ̄)~*

Asuhe 微信支付

微信支付

Asuhe 支付宝

支付宝

Asuhe 贝宝

贝宝