[regex] 正则表达式入门教程

本文译自:Regex tutorial — A quick cheatsheet by examples
一个测试regex的网站:https://regex101.com/

标志

regex通常包含在一对/中,如/abc/。在第二个/后面可以指定标志:

  • g(global):匹配成功后继续往下匹配。
  • m(multi-line):^$在行内搜索,而不是整个字符串
  • i(insensitive):大小写不敏感

锚定— ^ and $

^begin			匹配开始的begin字符串
end$			匹配结尾的end字符串
^begin end$		匹配开始为begin结尾为end的字符串
foobar			匹配字符串foobar

这里开头结尾的定义受标志m影响。

量词— * + ? and {}

abc*			匹配ab之后紧跟0个或多个c
abc+			匹配ab之后紧跟1个或多个c
abc?			匹配ab之后紧跟0个或1个c
abc{num}		匹配ab之后紧跟num个c
abc{num,}		匹配ab之后紧跟num个或更多c
abc{num1,num2}	匹配ab之后紧跟num1到num2个c
a(bc)*			匹配a之后紧跟0个或多个bc

“或”运算符 — | or []

a(b|c)			匹配a之后紧跟b或c
a[bc]			同上

字符类别— \d \w \s and .

\d				匹配一个数字字符
\w				匹配一个单词
\s				匹配一个空白字符
.				匹配任意字符

将上面的字母大写进行反向匹配:

\D				匹配一个非数字字符
\W				匹配一个非单词
\S				匹配一个非空白字符

转义字符

下面几个字符都需要进行转义,在字符前加\即可:
^ . [ $ ( ) | * + ? { \

分组和捕获 — ()

a(bc)				匹配abc,bc分组捕获
a(?:bc)				匹配abc,bc分组,禁用捕获
a(?<foo>bc)			匹配abc,bc分组捕获,将分组命名为foo

括号内的字符串形成一个分组,可以和“量词”连用。
分组捕获的内容可以用于“反向引用”(见后文),还可以用编程语言(JS,C/C++,Python,Java)提取出来。多个匹配结果以数组的形式输出;如果使用分组命名,将以map的形式输出,键名为每个分组的名称。

括号表达式 — []

[abc]				匹配其中任一字符
[a-z]				匹配a-z的任一字符
[a-fA-F0-9]			匹配这些范围内的任一字符
[^a-zA-Z]			匹配任一不在这些范围内的字符

贪婪和懒惰匹配

* + {}默认以贪婪模式进行搜索,尽可能地扩展搜索范围。

比如对This is a <div> simple div</div> test执行<.+>模式匹配,将得到<div> simple div</div>

在后面加上?可以让它以lazy模式进行搜索。

<.+?>					匹配<和>中的任意内容,必要时才扩展
<[^<>]+>				比上面的更严谨一些

分界符— \b and \B

\babc\b					对abc全词匹配
\Babc\B					abc必须被其他字符环绕

反向引用 — \1

([abc])\1				匹配和第一个捕获分组相同的内容
([abc])([de])\2\1		\n代表从左到右第n个捕获分组
(?<foo>[abc])\k<foo>	通过名称引用之前的捕获分组

先行断言和后行断言 — (?=) and (?<=)

d(?=r)					匹配d后紧跟r的字符串,不把r包括在内
(?<=r)d					匹配d之前紧跟r的字符串,不把r包括在内

同样可以使用它的否定操作符:(?!r)(?<!r)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值