正则表达式怎么匹配前面紧跟某个字符串的字符
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式怎么匹配前面紧跟某个字符串的字符相关的知识,希望对你有一定的参考价值。
匹配后面紧跟字符串n的X字符串的写法是x(?=n),匹配前面紧跟字符串n的字符串X该怎么写?
cjcwrkqwovo你是王八蛋
正则表达式 :是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
普通字符 :由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。
\'strng 放置源字串:Dim strng:strng="abddd...<h3 class=""r""><a href="" http://www.newmind40.com/ai_gb.htm"" target=_blank class=l onmousedown=""return clk(0,\'\',\'\',\'\',\'12\',\'\',\'0CCQQFjABOAo\')""><em>好好学习</em></a></h3>..."。
是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
可以通过在一对分隔符之间放入表达式模式的各种组件来构造一个正则表达式,即/expression/
普通字符
由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。
非打印字符
字符 含义
\cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。
特殊字符
所谓特殊字符,就是一些有特殊含义的字符,如上面说的"*.txt"中的*,简单的说就是表示任何字符串的意思。如果要查找文件名中有*的文件,则需要对*进行转义,即在其前加一个\。ls \*.txt。正则表达式有以下特殊字符。
特别字符 说明
$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。
* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
. 匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \。
[ 标记一个中括号表达式的开始。要匹配 [,请使用 \[。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。
标记限定符表达式的开始。要匹配 ,请使用 \。
| 指明两项之间的一个选择。要匹配 |,请使用 \|。
构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或或或共6种。
*、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
正则表达式的限定符有:
字符 描述
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 。
? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 。
n 是一个非负整数。匹配确定的 n 次。例如,'o' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
n 是一个非负整数。至少匹配n 次。例如,'o' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o' 等价于 'o+'。'o' 则等价于 'o*'。
m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o" 将匹配 "fooooood" 中的前三个 o。'o' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
定位符
用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。不能对定位符使用限定符。
选择
用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。
其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。
后向引用
对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始,连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 '\n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对相关匹配的保存。
各种操作符的运算优先级
相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下:
操作符 描述
\ 转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, , , 限定符
^, $, \anymetacharacter 位置和顺序
| “或”操作
全部符号解释
字符 描述
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 。
? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 。
n 是一个非负整数。匹配确定的 n 次。例如,'o' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
n 是一个非负整数。至少匹配n 次。例如,'o' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o' 等价于 'o+'。'o' 则等价于 'o*'。
m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o" 将匹配 "fooooood" 中的前三个 o。'o' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
? 当该字符紧跟在任何一个其他限制符 (*, +, ?, , , ) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
(pattern) 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。
(?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern) 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
x|y 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
[xyz] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^xyz] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\cx 匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。.
\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。
\n 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。
VBScript内的使用方法:
function gfCheck(obj)
dim strCheck '待检字符串
dim objRE '正则式对象
dim strRtn '正则式判断结果
strCheck = obj.value
set objRE = New RegExp
objRE.Pattern = "^[A-Za-z0-9]$" '13位的英文字符和数字串
gfCheck = objRE.Test(strCheck) '符合正则式则返回true,反之则返回false
set objRE = nothing
end function
常用的正则式
1、非负整数:”^\d+$”
2、正整数:”^[0-9]*[1-9][0-9]*$”
3、非正整数:”^((-\d+)|(0+))$”
4、负整数:”^-[0-9]*[1-9][0-9]*$”
5、整数:”^-?\d+$”
6、非负浮点数:”^\d+(\.\d+)?$”
7、正浮点数:”^((0-9)+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$”
8、非正浮点数:”^((-\d+\.\d+)?)|(0+(\.0+)?))$”
9、负浮点数:”^(-((正浮点数正则式)))$”
10、英文字符串:”^[A-Za-z]+$”
11、英文大写串:”^[A-Z]+$”
12、英文小写串:”^[a-z]+$”
13、英文字符数字串:”^[A-Za-z0-9]+$”
14、英数字加下划线串:”^\w+$”
15、E-mail地址:”^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$”
16、URL:”^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$”
参考技术B 进入后台→系统→SQL命令行工具→运行SQL命令行: 单行命令执行查询命令:
1.将所有文档设置为“仅动态”:update dede_archives set ismake=-1
2.将所有文档设置为“仅静态”:update dede_archives set ismake=1
3.将所有栏目设置为“使用动态页”: update dede_arctype set isdefault=-1
4.将所有栏目设置为“使用静态页”: update dede_arctype set isdefault=1
pcre和正则表达式的误点
本文只是关于正则一些容易出错的地方,关于正则的学习,可参考如下两篇文章:
基础正则:https://www.cnblogs.com/f-ck-need-u/p/9621130.html
Perl正则:https://www.cnblogs.com/f-ck-need-u/p/9648439.html
1.正则中所有的匹配模式,都应该理解为"匹配了某字符或字符串后,紧跟着再匹配"。这个概念很重要。
2.中括号首部使用脱字符时,表示的是紧跟着匹配不含给定字符的字符,而不是允许不匹配给定的字符。
它们大多数时候是等价的,但在匹配行尾时,意义不同,例如:Aa[^bcd]$ 所匹配的行允许是Aaa$或Aax$,但不允许仅是Aa$。
这就是正则中"紧跟着匹配"的意思。
3.(\\.[0-9]+)? 可匹配小数点部分,不能写成 (\\.?[0-9]*) ,后者即使不能匹配小数点,也能匹配原本处于小数点后的数值
4.星号*匹配问题0或多个字符,如果写成"a*",将可以匹配任何单个字符,只不过对于非a字符,匹配到的结果为空。
例如字符串"111aaaAAA",正则"1a*"其实从读取第2个字符进行匹配的时候就已经匹配完成了,匹配的结果不是"1aaa",而是"1"加上1前面的一个空,因为是从行首这个锚定位开始匹配的。使用sed或perl进行替换操作就很容易理解。
$ echo \'111aaaAAA\' | perl -lne \'print s/a*/b/rg\' b1b1b1bbAbAbAb # 每一个非a字符前都被替换了 $ echo \'111aaaAAA\' | perl -lne "/1a*/;print $&;print $\'" 1 # 表示匹配到的内容 11aaaAAA # 表示匹配后剩下的内容
这可能不是很好理解。但其实想想".*"的作用,其实他们是同一类的写法,正如".*"并不是先用点去匹配一个字符后再通过星号去重复这个字符,而是直接表示匹配可能任意多个的任一字符。不同之处在于,".*"匹配任何单个字符,而"a*"匹配任何单个字符,包括空位置。
另外,有些语言在处理正则的方式上有些差异,特别是在测试"a*"的时候,grep/sed/perl均有所不同,不过python/perl/ruby之类的语言在处理这个问题上,结果都一样。
5.perl正则括号分组时,使用(?:替代左括号(,可以表示只分组不捕获。所谓的捕获表示的是可以反向引用或保存到正则外部的变量中
([-+]?[0-9]+(\\.[0-9]+)?) *(cm|mm) :(cm|mm)将保存为$3
([-+]?[0-9]+(?:\\.[0-9]+)?) *(cm|mm) : (cm|mm)将保存为$2
6.特殊锚定符,锚定所匹配的是位置,而非字符,行首^和行尾$同样如此。
注意某些程序对单词的理解和边界定义不一样。且有些程序并不完全支持下列所有的特殊元字符。一般来说,单词是由字母、数字和下划线组成的,即[a-zA-Z0-9_]。
例如gnu grep 2.6版本就不支持\\s和\\d,而gnu grep 2.20支持\\s但不支持\\d
\'\\b\':匹配单词边界处的空字符Match the empty string at the edge of a word.
\'\\B\':匹配非单词边界处的空字符Match the empty string provided it\'s not at the edge of a word.
\'\\<\':匹配单词开头处的空字符Match the empty string at the beginning of word.
\'\\>\':匹配单词结尾处的空字符Match the empty string at the end of word.
\'\\w\':匹配单词构成部分Match word constituent, it is a synonym for `[_[:alnum:]]\'.
\'\\W\':匹配非单词构成部分Match non-word constituent, it is a synonym for `[^_[:alnum:]]\'.
\'\\s\':匹配空白字符Match whitespace, it is a synonym for `[[:space:]]\'.
\'\\S\':匹配非空白字符Match non-whitespace, it is a synonym for `[^[:space:]]\'.
\'\\d\':匹配数字it is a synonym for `[0-9]\'.
\'\\D\':匹配非数字it is a synonym for `[^0-9]\'.
For example, \'\\brat\\b\' matches the separate word \'rat\', \'\\Brat\\B\' matches \'crate\' but not \'furry rat\'.
注意,\'\\b\'不仅仅只是简单的表示"匹配单词的边界空字符",它还要求它的左边或右边(且只能是一边)有单词字符。比如`.\\b`能匹配"abc/"中的c,但不能匹配最后那根斜线,因为"\\b"左边是非单词字符,右边是字符串结尾,也是非单词字符。但".\\b"能匹配"abc/x"中的"c"和"/"和"x"。
7.字符类,注意某些程序并不完全支持下列所有的字符类
\'[:alnum:]\' :same as \'[0-9A-Za-z]\'.
\'[:alpha:]\' :\'[:lower:]\' and \'[:upper:]\', same as \'[A-Za-z]\'.
\'[:lower:]\' :
\'[:upper:]\' :
\'[:digit:]\' :\'0 1 2 3 4 5 6 7 8 9\'.
\'[:xdigit:]\' :Hex digits: `0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f\'.
\'[:blank:]\' :space and tab.
\'[:space:]\' :tab, newline, vertical tab, form feed, carriage return, and space.
\'[:punct:]\' :Punctuation characters; this is \'! " # $ % & \' ( ) * + , - . / : ; < = > ? @ [ \\ ] ^ _ ` { | } ~\'.
\'[:print:]\' :\'[:alnum:]\', \'[:punct:]\', and space.
\'[:graph:]\' :Graphical characters: \'[:alnum:]\' and \'[:punct:]\'.
\'[:cntrl:]\' :Control characters. octal codes 000 through 037, and 177 (`DEL\').
8.同一个表达式中,被匹配过的字符无法被第二次匹配。因为正则的宗旨是:匹配了某字符或字符串后,紧跟着再匹配。
例如字符串"#c#",正则表达式"(#.)(.#)"无法匹配。
再例如字符串"#cc#",正则表达式"(#.)(.*)(.#)"能匹配成功,只不过第二个分组只能匹配空。
9."环视"锚定,即lookaround anchor(也称为"零宽断言",表示匹配的是位置,不是字符)。
以 (?= 替代左括号表示从左向右的顺序环视,例如(?=\\d)表示当前字符的右边是一个数字时就满足条件
以 (?<= 替代左括号表示从右向左的逆序环视,例如(?<=\\d)表示当前字符的左边是一个数字时就满足条件
- 正向环视:(?=...)和(?!...),感叹号表否定,即无法匹配感叹号右边的字符时才捕获。
- 逆向环视:(?<=...)和(?<!...)
逆向环视的表达式必须只能表示固定长度的字符串,例如(?<=word)或(?<=word|word)可以,但(?<=word?)不可以,因为?匹配0或1长度,长度不定。
在PCRE中,可重写为(?<=word|words),但perl中不允许,因为perl严格要求长度必须固定。
10.关于"环视"锚定,最需要注意的一点是匹配的结果不占用任何字符,它仅仅只是锚定位置。
例如:your name is longshuai MA 和 your name is longfei MA
使用(?=longshuai)将能锚定第一个句子中单词"longshuai"前面的空字符,但它的匹配结果是"longshuai"前的空白字符,
所以(?=longshuai)long才能代表"long"这几个字符串
所以仅对于此处的两个句子,long(?=shuai)和(?=longshuai)long是等价的
11.贪婪匹配、惰性匹配和占有优先匹配
默认情况下,对于重复次数的表达式都是贪婪匹配,表示尽可能多的匹配。
有些高级正则引擎支持惰性匹配,表示尽可能少的匹配,只要能满足条件就立即停止。
- *、 +、 ?、 {M,N} :都是贪婪匹配(greedy)
- *?、 +?、 ??、 {M,N}? :都是惰性匹配(lazy,Reluctant)
- *+、 ++、 ?+、 {M,N}+ :都是占有优先匹配(possessive)
占有优先和固化分组是相同的,只要占有了就不再交换,不允许进行回溯。示例见下面的(?>...)固化分组方式
12.匹配模式
- (?i):不区分大小写,可使用(?-i)取消该模式。例如"(?i)abc(?-i)cdB"只对中间的abc进行不区分大小写的匹配
- 由于(?i)遇到闭括号就失效,可以将需要不区分大小写匹配的部分写入分组括号中,例如"((?i)abc)cdB",(?:(?i)abc)cdB=(?i:abc)cdB
- (?x):extend模式,将忽略多个连续空格和注释符到行尾的字符
- (?m):(multiline)多行模式,改变^和$的匹配模式。默认模式下,它们匹配字符串首部和尾部。此模式下:
- ^将匹配字符串首部和换行符。若要仅匹配字符串首部,使用\\A。
- $将匹配字符串尾部、换行符和换行符前的空字符。若要仅匹配字符串尾部和行尾,使用\\Z,若要仅匹配字符串尾部,使用\\z
- (?s):(singleline或dotall)单行模式,改变"."的匹配模式,默认模式下,点"."无法匹配换行符,dotall模式下可以
- (?U):lazy匹配模式。默认是greedy匹配。
13.强制字面解释:\\Q...\\E。该序列将其中间的所有字符强制解释为字面符号,强制性极强。
但perl和pcre有所不同。perl中,该序列中间可引用变量进行变量替换,而pcre中变量符号也被当作普通字符。
14.普通分组和捕获
- (),$1,$2,$3,$4...有些地方使用\\1,\\2,\\3,\\4,sed中使用&表示所有匹配,perl中则使用$&
- \\g1,\\g2,\\g3或\\g{1},\\g{2},\\g{3}。
其中$1,$2, ...用于正则外面,而"\\g1", "\\g2", ... 用于正则内部
15.命名分组和捕获
- (?:...):非命名捕获,仅用于分组,不可用于引用,也称为非捕获型括号。例如"(1|one)(?:2|two)(3|three)",$1=(1|one),$2=(3|three)
- (?<NAME>...):命名捕获,分组捕获后还命名,就像变量赋值一样。可以使用\\k<NAME>或\\k\'NAME\'或\\g{NAME}的方法来引用
- (?>...):固化分组。一匹配成功就永不交回内容(用回溯的想法理解很容易)。
例如"hello world"可以被"hel.* world"进行匹配,但不能被"hel(?>.*) world"匹配。
因为正常情况下,".*"匹配到所有内容,然后回溯释放已匹配内容直到空格" "字符。而固化分组后,已匹配的内容绝不交回,也就无法回溯。
16. 重置匹配:\\K 用于重置匹配的位置。
比如,foot\\Kbar 匹配”footbar”,但是得到的匹配结果是 ”bar”。但是, \\K 的使用不会干预到子组内的内容, 比如 (foot)\\Kbar 匹配 ”footbar”,第一个子组内的结果仍然会是 ”foo”。
$ echo abc123abcfoo | grep -P -o \'(abc)123\\K\\g1foo\' abcfoo
17.要想对一个字符串匹配后取反。可以通过正向环视锚定取反来间接实现。
例如,"-a -3 ac c 3 b"中取出负数、正数和空格很简单,"-?[0-9]+|\\s"即可,但想要借此取反得到"-a ac c b",目前正则表达式只能通过(?!)的环视取反实现:"((?!-?[0-9]+|\\s).)*",外层括号表示右边不是正数、负数或空格的字符都匹配并进行分组,然后重复量词*,将连续的内容连接起来。
例如:
echo "-a -3 ac c 3 b" | grep -P \'((?!-?[0-9]+|\\s).)*\'
...
以上是关于正则表达式怎么匹配前面紧跟某个字符串的字符的主要内容,如果未能解决你的问题,请参考以下文章