正则表达式regexp
百度百科-正则表达式
Python正则表达式
正则表达式替换-部分内容不变
实质是用$1、$2等替代匹配内容。但要成功的话,查找中的匹配内容要有括号括起来。
如:
1、改为1.
查找:([0-9])、
替换为:$1.
greedy或non-greedy(lazy)
greedy是贪婪模式,*
+
?
默认都是贪婪的,这样可能会匹配不到想要的结果,比如<a><b><c>
使用<.*>
匹配的是<a><b><c>
而不是<a>
,在这三个符号后加个?
可以使其变成lazy懒惰模式,如<.*?>
《精通正则表达式第三版》
系统性的学习下,确实搞明白了很多以前很模糊的内容,比百度四处找到的一知半解的文章强多了。
特别注意一点是,不同语言对正则的实现不同,这叫做favour流派不同.
四个分组
[]
表示字符组
, 只会匹配单个字符. 要匹配什么字符写什么字符. ASCII或者UTF-8码表中的连续字符可以用连字符-
简写. 比如[0123456789]简写为[0-9],[0-9a-zA-Z]匹配所有数字字母. [-0-9!_?]其中只有第二个连字符是特殊字符, 因为特殊符号在不同组类型内的含义不同
. 还可用[^0-9]
匹配数字以外的字符(这儿有一个^
在[]
内外不同意义的例子){min,max}
表示前面的匹配结果重复次数min~max次. 其他表示重复次数的包括0~1次的?
,1~无穷次的+
, 0~无穷次的*
(...)
同时表示分组和分组引用,...
表示正则表达式.分组后即可以看成一个整体.()
出现的次数则按\数字
引用. 如出现3个()
则后面可以用\1
\2
\3
依次引用,在vscode中则使用 $1 $2 $3引用
. 如果想要只分组不引用, 需要用(?:...)
|
前后各一个正则表达式组. 因为这个符号优先级最低,所以不用担心被先计算. 不过,aa|a
和a|aa
匹配字符串aa
结果不同,前者匹配到aa
,后者匹配到两个a
. 匹配到左边的以后,右边的就不会再匹配了.
特殊符号在不同组类型内的含义不同
不在任何括号内时:
^
匹配行首,$
匹配行尾- egrep中,
\<
\>
匹配单词首尾