正则表达式

正则表达式


正则表达式有不同的引擎,不同的语言可使用的引擎可能有所不同,导致语法有所差异。常用的是prel语法和javascript中的正则表达式。在UltraEdit中可更改正则表达式的语法

基础语法

元字符

元字符 说明
. 除换行符外的任意字符
\d 匹配数字
\D 匹配非数字
\w 匹配单词字符,数字、字母、下划线,同[0-9a-zA-z_]
\W 匹配非单词字符,同[^0-9a-zA-Z_]
\s 匹配空白字符,同[ \f\n\r\t\v]
\S 匹配非空白字符,同[^ \f\n\r\t\v]
\A 匹配字符串的开始位置
\z 匹配字符串的结束位置
\Z 仅匹配字符串的结尾,或者结尾的换行符之前
\b 匹配单词边界,开始或结束
\B 匹配非单词边界位置,即单词中间
* 匹配前面的字符0次或多次
+ 匹配前面的字符1次或多次
? 匹配前面的字符0次或1次,或用于非贪婪模式
{n} 精确匹配n次
匹配至少n次
{n,m} 匹配n到m次
[xyz] 字符集合,匹配集合中的任一个字符
[^xyz] 非字符集合,匹配不在集合中的任一个字符
[a-d] 字符范围,匹配范围中的任一个字符
[^a-d] 非字符范围,匹配不在字符范围的任一个字符
\uxxxx 匹配4个十六进制xxxx表示的unicode字符
(pattern) 匹配模式并记住匹配项

或语句

ab|cd匹配ab或者cd,不匹配abd和acd。的优先级最低,两边的字符先与其他的成组再参与或运算

[]表达式

[abc]匹配"abc"其中一个字符,只能是__单个字符__。如[a-z]匹配一个小写英文字母。

贪婪模式与非贪婪模式

默认情况下,正则表达式的匹配是贪婪模式的,即匹配尽可能多的内容。如

a.+c匹配abcdec时,会匹配所有的内容,直到第二个c处。

如果想使用非贪婪模式,在模式后添加?(问号)即可,如

a.+?c匹配abcdec时,会匹配abc,在第一个c处停止。

chatGPT的回答

正则表达式默认是贪婪模式(Greedy Mode),即尽可能匹配更多的字符。如果想使用非贪婪模式(Non-Greedy Mode),即尽可能匹配最少的字符,可以在量词后面添加一个问号(?)。

例如,*是一个贪婪的量词,表示匹配前一个字符出现0次或多次。在它后面加上问号就可以变成非贪婪的量词,即*?,表示匹配前一个字符出现0次或最少次。同理,+?{n,m}等量词也可以使用非贪婪模式

零宽断言

零宽断言指一种零宽度的匹配,匹配的是一个位置。可以现解为断言指一个位置

根据该位置在所需字段的前后可分先行断言和后发断言。

根据出现或不出现匹配字段分为正向和负向。

因为字符串匹配是由左向右的,因此位置后匹配(先行)是预测该位置后面的内容,位置前匹配(后发)是回顾位置前面的内容

匹配不出现某一字段的行

^((?!exp).)*$

(?!exp)表示不出现exp字段的位置,“.”表达任意一个字符。“(?!exp).”即表示不出现exp字段的任一字符,“((?!exp).)*”表示重复零次和多次

非捕获分组

正则表达式中的 (?:pattern) 是非捕获分组(Non-Capturing Group),用于指定一个子表达式,但不捕获匹配的文本。

w3cschool 中的解释

匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。

()表示捕获分组,()会把每个分组里的匹配的值保存起来,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推