# 正则表达式急速上手
正则表达式,即 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。