【学习笔记】正则表达式
中文:正则表达式
英文:Regular Expression,Regex,Regexp
# 常见匹配规则
字符语法 | 说明 |
---|---|
\d | 匹配一个数字字符。等价于 [0-9]。grep 要加上 - P,perl 正则支持 |
\D | 匹配一个非数字字符。等价于 [^0-9]。grep 要加上 - P,perl 正则支持 |
\f | 匹配一个换页符。等价于 \x0c 和 \cL。 |
\n | 匹配一个换行符。等价于 \x0a 和 \cJ。 |
\r | 匹配一个回车符。等价于 \x0d 和 \cM。 |
\s | 匹配任何不可见字符,包括空格、制表符、换页符等等。等价于 [\f\n\r\t\v]。 |
\S | 匹配任何可见字符。等价于 [^ \f\n\r\t\v]。 |
. | 匹配任何字符 |
[...] | 匹配括号中的任何字符,如 [abc] |
^ | 匹配输入字行首。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 “\n” 或 “\r” 之后的位置。 |
$ | 匹配输入行尾。如果设置了 RegExp 对象的 Multiline 属性,$ 也匹配 “\n” 或 “\r” 之前的位置。 |
\w | 匹配包括下划线的任何单词字符。类似但不等价于 “[A-Za-z0-9_]”,这里的 "单词" 字符使用 Unicode 字符集。 |
\W | 匹配任何非单词字符。等价于 “[^A-Za-z0-9_]”。 |
\b | 匹配一个单词的边界,也就是指单词和空格间的位置(即正则表达式的 “匹配” 有两种概念,一种是匹配字符,一种是匹配位置,这里的 \b 就是匹配位置的)。例如,“er\b” 可以匹配 “never” 中的 “er”,但不能匹配 “verb” 中的 “er”;“\b1_” 可以匹配 “1_23” 中的 “1_”,但不能匹配 “21_3” 中的 “1_”。 |
\B | 匹配非单词边界。“er\B” 能匹配 “verb” 中的 “er”,但不能匹配 “never” 中的 “er”。 |
# 限定符
字符语法 | 说明 |
---|---|
$ | 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 $。 |
( ) | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 (和)。 |
* | 匹配前面的子表达式零次或多次 (0,+∞)。要匹配 * 字符,请使用 *。 |
+ | 匹配前面的子表达式一次或多次 (1,+∞)。要匹配 + 字符,请使用 +。 |
. | 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 . 。 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配?字符,请使用?。 |
[ | 标记一个中括号表达式的开始。要匹配 [,请使用 [。 |
\ | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\' 匹配 "",而 '(' 则匹配"("。 |
^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 ^。 |
# 常用正则表达式
iPv4: ^((25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(25[0-5]|2[0-4]\d|[01]?\d?\d)$
URL: [a-zA-z]+://[^\s]*
# 匹配前后包含或不包含 XX
(?<!7) centos 查找 centos,而前面又不含 7 的
(?<=7) centos 查找 centos,且前面含 7 的
centos (?!7) 查找 centos,且后面不含 7 的
centos (?=7) 查找 centos,且后面含 7 的
# (?:pattern)
非获取匹配,匹配 pattern 但不获取匹配结果,不进行存储供以后使用。这在使用或字符 “(|)” 来组合一个模式的各个部分是很有用。例如 “industr (?:y|ies)” 就是一个比 “industry|industries” 更简略的表达式。
# (?=pattern)
非获取匹配,正向肯定预查,在任何匹配 pattern 的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如,“Windows (?=95|98|NT|2000)” 能匹配 “Windows2000” 中的 “Windows”,但不能匹配 “Windows3.1” 中的 “Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
# (?!pattern)
非获取匹配,正向否定预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如 “Windows (?!95|98|NT|2000)” 能匹配 “Windows3.1” 中的 “Windows”,但不能匹配 “Windows2000” 中的 “Windows”。
# (?<=pattern)
非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95|98|NT|2000) Windows” 能匹配 “2000Windows” 中的 “Windows”,但不能匹配 “3.1Windows” 中的 “Windows”。
# (?<!pattern)
非获取匹配,反向否定预查,与正向否定预查类似,只是方向相反。例如 “(?<!95|98|NT|2000) Windows” 能匹配 “3.1Windows” 中的 “Windows”,但不能匹配 “2000Windows” 中的 “Windows”。这个地方不正确,有问题
# 扩展:VS Code 替换
查找: (\d{3}) (.*)
替换: $2-$1
(每个括号内匹配值的为一个变量,索引从 1 开始)