讲解

正则里最「不神奇」的部分是字面量:普通的字母、数字、汉字写进模式里,就表示「精确匹配这个字符本身」。模式 /cat/ 匹配文本中的 c-a-t 三个连续字符,模式 /教程/ 匹配文本中的「教程」两个字。大多数字符都是字面量,只有少数元字符(下一章)有特殊含义。

两个默认行为必须记牢。第一,正则默认区分大小写:/cat/ 匹配不了 Cat。想忽略大小写需要加 i 标志(标志位一章细讲)。第二,默认的匹配是「搜索子串」而不是「整串比较」:/cat/.test('concatenate') 是 true,因为 concatenate 里藏着 cat。想让整个字符串从头到尾都符合模式,要用 ^ 和 $ 锚点钉住两端(锚点一章细讲)。

容易忽略的是:空格、标点也都是普通字符,同样参与匹配。/a b/ 里的空格是实实在在要匹配一个空格字符,不会自动跳过空白。中文标点和英文标点也是不同字符——模式里的英文逗号匹配不了文本里的全角逗号,写模式时要确认目标文本用的到底是哪种。

示例

// 普通字符就是字面量,逐字符精确匹配
const re = /cat/;
console.assert(re.test('my cat sleeps') === true);
console.assert(re.test('Cat') === false); // 默认区分大小写
console.assert(re.test('concatenate') === true); // 子串匹配:不要求整词

// 汉字同样是字面量
const zh = /教程/;
console.assert(zh.test('正则表达式教程') === true);
console.assert(zh.test('正则表达式') === false);

// 空格和标点也参与匹配
console.assert(/a b/.test('a b') === true);
console.assert(/a b/.test('ab') === false);
console.assert(/你好,世界/.test('你好,世界') === false); // 英文逗号 ≠ 全角逗号

不加锚点的 test 本质是「包含」判断,这是初学者最常误解的地方:

// /9527/ 只要求文本里「含有」9527
console.assert(/9527/.test('A9527B') === true);

// 想表达「整串就是 9527」,需要 ^ 和 $ 把两端钉住
console.assert(/^9527$/.test('9527') === true);
console.assert(/^9527$/.test('A9527B') === false);
console.assert(/^9527$/.test('95270') === false);

常见坑

  • 以为 test 是整串比较:/\d+/.test('abc123') 是 true。校验场景(如表单)几乎总是需要 ^...$ 把整串钉住,否则用户输入「abc123」也能通过「数字校验」。
  • 忘记默认区分大小写:用户输入的大小写不受控,需要忽略时加 i 标志,或者先把文本统一转小写再匹配。
  • 看不见的空格和全角字符:从网页、Word 复制来的文本常混有全角空格、不间断空格,模式里的普通空格匹配不上它们,表现为「明明一样却不匹配」。
  • 把元字符当字面量直接写:想匹配 3.14 写成 /3.14/ 会连 3514 一起匹配——点号是元字符。哪些字符要转义,下一章讲。

小结

普通字符即字面量,逐字符精确匹配;正则默认区分大小写、做的是子串搜索,整串校验要加 ^$。下一节认识拥有特殊含义的元字符。