正则表达式
正则表达式
正则表达式有不同的引擎,不同的语言可使用的引擎可能有所不同,导致语法有所差异。常用的是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表达式 - 零宽度负预测先行断言
(?!exp)
位置后不匹配exp表达式
因为字符串匹配是由左向右的,因此位置后匹配(先行)是预测该位置后面的内容,位置前匹配(后发)是回顾位置前面的内容
匹配不出现某一字段的行
^((?!exp).)*$
(?!exp)表示不出现exp字段的位置,“.”表达任意一个字符。“(?!exp).”即表示不出现exp字段的任一字符,“((?!exp).)*”表示重复零次和多次
非捕获分组
正则表达式中的 (?:pattern)
是非捕获分组(Non-Capturing Group),用于指定一个子表达式,但不捕获匹配的文本。
w3cschool 中的解释
匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
()表示捕获分组,()会把每个分组里的匹配的值保存起来,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推