WebGL Tutorial
and more

字符位置

撰写时间:2024-03-01

修订时间:2024-03-03

概述

这一部分均是关于字符特定位置是否符合特定条件的匹配。

这一部分在英语中属于assertion,中文一般翻译为断言。在英语环境中,assert确保条件成立的意思,而中文环境中断言通常指下结论的意思,而此与英文语境有较大出入。

为此,在语境明确的情况下,没必要一定要加上断言而显得画蛇添足。例如,^匹配行首的表述已足够清晰。而对于x(?=y),我们使用动词来表意:右边出现则匹配,中文语义很清晰。

^: 行首

^来匹配行首。

const src = `One plus one is two.`; let re = /^one/gi;

输入源中共有两个One,但只有行首的One被匹配。

注意,这里为了同时匹配两个大小写不一样的one,特打开了i开关,它将忽略大小写。尽管如此,因为有行首的特别要求,第二个one还是得不到匹配。

我们可以使用^来快速找出一行中的首字母是否小写字母的错误:

const src = `this capital letter is incorrect.`; let re = /^[a-z]/g;

$: 行尾

$来匹配行尾。

const src = `trademark patent copyright patent`; let re = /patent$/g;

输入源中共有两个patent,但只有行尾的patent被匹配。

\b: 字符边界

\b来匹配字符边界。

const src = `This mark is not a trademark.`; let re = /\bmark/g;

输入源中共有两个mark,但只有第一个mark的左边因有空格符而成为该字符的边界,因而被匹配。而第二个mark的左边还有其他字符,未成能为其边界,因而未被匹配。

\b还可置于右边而匹配字符右边界。

const src = `The beating is suspended for tea.`; let re = /ea\b/g;

\B: 非字符边界

\B来匹配非字符边界。

const src = `This mark is not a trademark.`; let re = /\Bmark/g;

输入源中共有两个mark,但只有第二个mark的左边不是字符边界。

x(?=y) : 右边出现则匹配

x(?=y)的意思为:如果x的右边出现y,则匹配x。英语中称为lookahead assertion: 查看前方是否符合条件(左后右前)。

const src = `This mark is not a trademark.`; let re = /is(?=\sma)/g;

输入源中共有两个is,第一个is因右边出现 ma,故被匹配。

x(?!y) : 右边没有出现则匹配

x(?!y)的意思为:如果x的右边不出现y,则匹配x。英语中称为negative lookahead assertion:查看前方是否没有出现特定条件。

const src = `This mark is not a trademark.`; let re = /is(?!\sma)/g;

输入源中共有两个is,第二个is因右边没有出现 ma,故被匹配。

(?<=y)x : 左边出现则匹配

(?<=y)x的意思为:如果x的左边出现y,则匹配x。英语中称为lookbehind assertion: 查看后方是否符合条件(左后右前)。

const src = `This mark is not a trademark.`; let re = /(?<=mark\s)is/g;

输入源中共有两个is,第二个is因左边出现mark ,故被匹配。

(?<!y)x : 左边没有出现则匹配

(?<!y)x的意思为:如果x的左边没有出现y,则匹配x。英语中称为negative lookbehind assertion: 查看后方是否没有出现特定条件。

const src = `This mark is not a trademark.`; let re = /(?<!mark\s)is/g;

输入源中共有两个is,第一个is因左边没有出现mark ,故被匹配。

参考资源

  1. ECMA 262: RegExp Objects
  2. MDN: Regular expressions