正则的断言
目录
断言
摘录自
man perlre
。
断言,零宽度,不包含在
$&
结果中。
向前断言
- “(?=pattern)” <- “(*positive_lookahead:pattern)”
- 例子:"/\w+(?=\t)/",匹配后跟
tab
的单词。 - “(?!pattern)” <- “(*negative_lookahead:pattern)”
- 例子:"/foo(?!bar)/",匹配后面没跟
bar
的foo
。 - 此语法不能用于
向后断言
。如果想找foo
后面的bar
,"/(?!foo)bar/“是无效的。
向后断言
/i
模式下,一些字符匹配2-3个其他字符,可能导致超出255的实验性长度限制。
- “(?<=pattern)” <- “\K” <- “(*positive_lookbehind:pattern)”
- 例子:”/(?<=\t)\w+/",匹配前面是
tab
的单词。5.30后实验性支持可变长度(1-255)的向后断言。 \K
写法,不支持可变长度。其实\K
只是匹配中,暂存各种匹配结果的地方,当然不进入$&
。\K
虽然可用于其他断言,但行为不确定。\K
比断言更有效。尤其在需要删除匹配后面的内容时。比如s/(foo)bar/$1/g
可写成s/foo\Kbar//g
,把bar
删除,保留foo
。- “(?<!pattern)” <- “(*negative_lookbehind:pattern)”
- 例子:"/(?<!bar)foo/“表示
foo
前面不能有bar
。
命名捕捉
- “(?
pattern)” “(?‘NAME’pattern)” - 和普通括号类似,但成功匹配后,名字可以在”%+“或者”%-“散列中,像”\g{NAME}“这样被引用。
- 如果有多个同名的成功匹配,
$+{NAME}
将指向最左边的一个。 - 例子:
/(x)(?<foo>y)(z)/
时,$+{foo}
和$2
是同一个结果。 - 名字可使用utf8。
- 某些语言,可使用”(?P
pattern)",此写法不支持单引号分割命名。
命名引用
- “\k
” “\k’NAME’” - 类似于数字引用。多组同名时,选用匹配组中最左边一个。
代码断言
- “(?{ code })”
- 执行代码,总是成功的,结果在
$^R
中。 - 谨慎的搞。
- “(??{ code })”
- 这个带返回值,不放在
$^R
中。
写个注释
- “(?#text)”
- 任意地方插入。使用/x模式也可写注释。
内嵌修饰词
- “(?adlupimnsx-imnsx)” “(?^alupimnsx)”
- 例子:"(?i)foobar",判断这条时,使用/i模式。
- 例子:
/((?im)foo(?-m)bar)/
,全句/i模式,但bar
取消/m模式。
纯判断模式
- “(?:pattern)”
- 用于你不需要匹配的结果时,此模式不把结果保存。
- “(?adluimnsx-imnsx:pattern)”
- 例子:
/(?s-i:more.*than).*million/i
等于/(?:(?s-i)more.*than).*million/i
。 - “(?^aluimnsx:pattern)”
分支重置模式
- “(?|pattern)”
递归子模式
- “(?PARNO)” “(?-PARNO)” “(?+PARNO)” “(?R)” “(?0)”
- “(?&NAME)”
- “(?(condition)yes-pattern|no-pattern)”
- “(?>pattern)”
- “(? )”
- 想死咧。不搞这些。
GJS的RegExp
\
需要转义。
|
|
词边界
|
|
之前哪里看的
\<
和\>
,咋找不到了。