- https://zh.wikipedia.org/wiki/正则表达式
- 2021/12/19,正则表达式历史
正则表达式, Regular Expression, 简写: regex, regexp, 正则。
一般用来以指定模式对字符串进行查找,替换,切割。
基本知识
Linux 下, grep, find 等命令支持几种风格:
find -regextype help
# find: 未知的正则表达式类型 ‘help’;合法的类型是 ‘findutils-default’, ‘ed’, ‘emacs’, ‘gnu-awk’, ‘grep’, ‘posix-awk’, ‘awk’, ‘posix-basic’, ‘posix-egrep’, ‘egrep’, ‘posix-extended’, ‘posix-minimal-basic’, ‘sed’。
man grep | grep -E '\-regexp$'
# -E, --extended-regexp
# -G, --basic-regexp
# -P, --perl-regexp
# -w, --word-regexp
# -x, --line-regexp
因为历史原因,大体上可以分为:
- 基本型正则表达式(Basic Regular Expression,BRE)
- 扩展型正则表达式(Extended Regular Express,ERE)
- PCRE(Perl兼容正则表达式,Perl Compatible Regular Expressions)
我见过的编程语言中都是采用最为强大的 PCRE 风格:
- PHP 是 pgeg_xxx 系列方法。
- Python 是 re 包。
- Go 是 regexp 包。
- C 直接使用
regex.h
(libc) - C++ 老版本也是
regex.h
,或者使用第三方库(如 boost), C++ 11 之后就内置正则支持了(std::regex
, 默认 ECMAScript 风格)
语法
特殊字符
Characters / constructs | Corresponding article |
---|---|
\ , . , \cX , \d , \D , \f , \n , \r , \s , \S , \t , \v , \w , \W , \0 , \xhh , \uhhhh , \uhhhhh , [\b] |
Character classes |
^ , $ , x(?=y) , x(?!y) , (?<=y)x , (?<!y)x , \b , \B |
Assertions |
(x) , (?:x) , (?<Name>x) , x|y , [xyz] , [^xyz] , \Number |
Groups and ranges |
* , + , ? , x{n} , x{n,} , x{n,m} |
Quantifiers |
\p{UnicodeProperty} , \P{UnicodeProperty} |
Unicode property escapes |
范围
.
\w
,\d
,\s
,\W
,\D
,\S
[abc]
[^abc]
[a-z]
分组
(abc)
\1
(?:abc)
(?=abc)
(?!abc)
量词
a*
,a+
,a?
a{7,9}
,a{7}
,a{7,}
a+?
,a{2,}?
其他
^
,$
ab|cd
or\b
,\B
word
修饰符
JavaScript:
g
globali
case insensitivem
multilines
single line (dotall)u
unicodey
sticky
Go:
i
m
s
U
Python:
re.A
,re.ASCII
re.I
,re.IGNORECASE
re.M
,re.MULTILINE
re.S
,re.DOTALL
re.DEBUG
re.X
,re.VERBOSE
参考资料与拓展阅读
- https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Cheatsheet
- https://docs.python.org/3/library/re.html
- https://golang.org/pkg/regexp/
- https://golang.org/s/re2syntax
- https://regexr.com/
- 精通正则表达式,看完这篇就行了