目录

正则的断言

断言

摘录自man perlre

断言,零宽度,不包含在$&结果中。

向前断言

  • “(?=pattern)” <- “(*positive_lookahead:pattern)”
  • 例子:"/\w+(?=\t)/",匹配后跟tab的单词。
  • “(?!pattern)” <- “(*negative_lookahead:pattern)”
  • 例子:"/foo(?!bar)/",匹配后面没跟barfoo
  • 此语法不能用于向后断言。如果想找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。
  • 某些语言,可使用”(?Ppattern)",此写法不支持单引号分割命名。

命名引用

  • “\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

\需要转义。

1
2
const re = new RegExp('\\b'+s+'\\b');
const r = str.match(re);

词边界

1
2
3
4
\b{}   Match at Unicode boundary of specified type
\B{}   Match where corresponding \b{} doesn't match
\b     Match a \w\W or \W\w boundary
\B     Match except at a \w\W or \W\w boundary

之前哪里看的\<\>,咋找不到了。