什么是正则表达式
正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression
,在代码中常简写为 regex
、regexp
或 RE
),计算机科学的一个概念。
正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl
中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由UNIX
中的工具软件(例如sed
和grep
)普及开的。正则表达式通常缩写成“regex”,单数有regexp
、regex
,复数有regexps
、regexes
、regexen
。简单的说形式和功能上正则表达式和通配符很像,不过它们之间又有很大差别,特别在于一些特殊的匹配字符的含义上,希望初学者注意不要将两者弄混淆。
附:通配符
通配符与正则表达式很容易混淆,首先要明白二者是不同的,个人感觉通配符用于Linux的shell命令(如文件名相关操作)中,而正则表达式用于文本内容中的字符串搜索和替换等。通配符是Linux系统本身就支持的,而正则表达式用于vim编辑器或awk程序,这些文本处理工具正是由于支持正则表达式才变得强大。
通配符
[a-z]或[12]:匹配方括号中指定范围内的单个字符或方括号列出的其中一个字符。
[!9]:不匹配方括号中所列字符或指定范围内的单个字符。
*:匹配0个字符或多个字符。
?:匹配任何单个字符,且不能为空字符。
由于shell会将字符?[ ] * 区别对待,因此在命令参数时如果需要用到这几个特殊字符,应将该参数用单引号标注或通过在特殊字符前加转义字符。
正则表达式基本语法
一个正则表达式通常被称为一个模式(pattern
),为用来描述或者匹配一系列符合某个句法规则的字符串。
选择
|
竖直分隔符表示选择,例如"boy|girl"可以匹配"boy"或者"girl"
数量限定
数量限定除了我们举例用的*,还有+加号,?问号,.点号,如果在一个模式中不加数量限定符则表示出现一次且仅出现一次
:
+
表示前面的字符必须出现至少一次(1次或多次),例如,"goo+gle",可以匹配"gooogle","goooogle"等;
?
表示前面的字符最多出现一次(0次或1次),例如,"colou?r",可以匹配"color"或者"colour";
*
星号代表前面的字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次),例如,“0*42”可以匹配42、042、0042、00042等。
范围和优先级
()
圆括号可以用来定义模式字符串的范围和优先级,这可以简单的理解为是否将括号内的模式串作为一个整体。例如,"gr(a|e)y"等价于"gray|grey",(这里体现了优先级,竖直分隔符用于选择a或者e而不是gra和ey),"(grand)?father"匹配father和grandfather(这里体验了范围,?将圆括号内容作为一个整体匹配)。
语法
正则表达式有多种不同的风格,下面列举一些常用的作为PCRE子集
的适用于perl
和python
编程语言及grep
或egrep
的正则表达式匹配规则:(由于markdown表格解析的问题,下面的竖直分隔符用全角字符代替,实际使用时请换回半角字符)
PCRE(Perl Compatible Regular Expressions
中文含义:perl语言兼容正则表达式)是一个用C
语言编写的正则表达式函数库,由菲利普.海泽(Philip Hazel)编写。PCRE
是一个轻量级的函数库,比Boost
之类的正则表达式库小得多。PCRE
十分易用,同时功能也很强大,性能超过了POSIX
正则表达式库和一些经典的正则表达式库。
优先级
优先级为从上到下从左到右,依次降低:
\
转义符()
, (?:)
, (?=)
, []
括号和中括号*
、+
、?
、{n}
、{n,}
、{n,m}
限定符^
、$
、\
任何元字符定位点和序列|
选择
正则表达式思维导图
参考
正则表达式基础
正则表达式wiki
几种正则表达式引擎的语法差异
各语言各平台对正则表达式的支持
属于自己的不要放弃,已经失去的留作回忆。