文档/教程前端【免费下载链接】en.javascript.infoModern JavaScript Tutorial项目地址https://gitcode.com/gh_mirrors/en/en.javascript.info点击查看免费下载导读本文围绕 Modern JavaScript Tutorial 仓库中“字符集与范围Sets and ranges”章节的实战练习/Java[^script]/是否匹配 Java 与 JavaScript 展开系统讲解方括号字符集[…]、范围range与排除型字符集[^…]的底层匹配规则。读完本文你将彻底理解字符集只匹配一个字符^表示排除而非锚点以及正则大小写敏感这三条核心规则并能独立解决同类实战问题。一、任务原文一道经典的陷阱题仓库中该练习的题目非常简洁见 task.md我们有一个正则表达式pattern:/Java[^script]/。它能在字符串subject:Java中匹配到任何内容吗在字符串subject:JavaScript中呢这个问题的答案出乎很多初学者的意料在Java中匹配不到任何内容但在JavaScript中能匹配到子串JavaS。为什么会有这样的结果关键就在于pattern:[^script]是一个排除型字符集excluding set而不是排除单词 script的逻辑。接下来我们层层拆解。二、前置知识方括号字符集[…]与范围在进入答案之前先回顾该章节正文 article.md 中的核心概念。2.1 字符集Set多个字符只匹配一个位置方括号[…]内的若干字符或字符类表示匹配其中任意一个字符。例如pattern:[eao]表示匹配a、e、o中的任意一个。// 查找 [t 或 m]然后是 op alert( Mop top.match(/[tm]op/gi) ); // Mop, top这里需要特别强调一条常被忽略的规则虽然字符集内写了多个字符但它对应匹配结果中恰好一个字符。所以下面的例子没有任何匹配// 查找 V然后 [o 或 i]再然后是 la alert( Voila.match(/V[oi]la/) ); // null无匹配因为pattern:[oi]只能消耗Voila中o这一个位置剩下ila无法再匹配pattern:la。只有形如Vola或Vila的字符串才能命中。2.2 范围Range连续的字符区间方括号内还可以写字符范围。例如pattern:[a-z]表示从a到z的任意字符pattern:[0-5]表示数字0到5。范围可以并列组合// 查找 x 后跟两个十六进制字符数字 0-9 或字母 A-F alert( Exception 0xAF.match(/x[0-9A-F][0-9A-F]/g) ); // xAF这里pattern:[0-9A-F]由两个范围组成要么是0到9的数字要么是A到F的字母。若还想匹配小写字母可以追加范围a-f写成pattern:[0-9A-Fa-f]或者直接加pattern:i标志让整个匹配不区分大小写。2.3 字符类是字符集的简写字符类本质上就是某些常见字符集的快捷写法这一点在正文的smart提示框中有明确对照\d—— 等价于pattern:[0-9]\w—— 等价于pattern:[a-zA-Z0-9_]\s—— 等价于pattern:[\t\n\v\f\r ]外加少量罕见的 Unicode 空白字符字符类也可以直接放进方括号组合使用例如pattern:[\w-]表示单词字符或连字符pattern:[\s\d]表示空白字符或数字。三、核心知识点排除型字符集[^…]在普通范围之外还有一类排除型范围写法是在开括号后紧跟一个脱字符^如pattern:[^…]。它匹配任意一个不在这组字符中的字符。几个典型例子均出自正文 article.mdpattern:[^aeyo]—— 除a、e、y、o之外的任意字符pattern:[^0-9]—— 除数字外的任意字符等价于\Dpattern:[^\s]—— 任意非空白字符等价于\S例如// 查找除字母、数字、空格之外的任意字符 alert( alice15gmail.com.match(/[^\d\sA-Z]/gi) ); // 和 .容易混淆的点这里的^只在方括号内、作为第一个字符时才表示排除。正则中独立的^是字符串开头锚点见仓库 正则锚点章节二者含义完全不同。四、题目详解为什么答案是 no, yes回到题目pattern:/Java[^script]/它的含义是依次匹配字面字符J、a、v、a然后匹配一个字符这个字符不能是s、c、r、i、p、t中的任何一个。注意排除列表只是六个字母s c r i p t它并不理解script 这个单词这一层语义。4.1 对 Java没有匹配null在字符串Java中Java四个字符被消费完之后已经到了字符串末尾后面没有任何字符可供pattern:[^script]消费。alert( Java.match(/Java[^script]/) ); // null这是最容易出错的地方初学者常以为Java后面没有 script所以满足不是 script的条件。但正则引擎是按字符逐个消费的排除型字符集必须实实在在匹配一个字符它不能匹配空。字符串结束不是字符所以整体匹配失败返回null。4.2 对 JavaScript匹配到 JavaS在JavaScript中Java之后紧跟着的字符是大写字母S。S并不在排除列表s c r i p t之中——注意排除列表里是小写s而这里是大写S。正则表达式默认区分大小写没有pattern:i标志引擎认为大写S与小写s是两个不同的字符所以S恰好满足不是s、c、r、i、p、t中任何一个的条件。alert( JavaScript.match(/Java[^script]/) ); // JavaS匹配结果是JavaS——即Java加上被[^script]消费的那个大写S而后面剩余的cript与本次匹配无关。五、趁热打铁同章第二题 hh:mm 或 hh-mm为了巩固对字符集用法的理解仓库在该练习之后还安排了一道同主题实战题2-find-time-2-formats/task.md时间可以是hours:minutes或hours-minutes两种格式时和分都是两位数字如09:00或21-30。写一个正则找出所有时间。标准解答是pattern:\d\d[-:]\d\d见 solution.mdlet regexp /\d\d[-:]\d\d/g; alert( Breakfast at 09:00. Dinner at 21-30.match(regexp) ); // 09:00, 21-30这道题的两个要点与本题一脉相承pattern:[-:]是一个普通字符集表示连字符或冒号二选一只占一个字符位置连字符-在方括号内只有位于两个字符之间时才表示范围当它位于字符集的开头或结尾时就只是普通字符-本身因此这里无需转义。这一规则同样适用于[^…]排除型字符集的内部写法。题目还提示本练习假定时间本身总是合法的不需要过滤45:67这类非法串稍后的正则课程会处理这种校验。六、进阶细节字符集内的转义规则与 Unicode 标志理解了排除型字符集的语义后再补充两条实战中高频踩坑的规则同样出自 article.md。6.1 方括号内的大多数特殊字符无需转义平时匹配特殊字符需要转义如pattern:\.匹配点号、pattern:\\匹配反斜杠但在方括号内部绝大多数特殊字符可以直接使用符号pattern:. ( )永远不需要转义连字符pattern:-在开头或结尾处不需要转义此时它不构成范围脱字符pattern:^仅在开头时需要转义因为开头位置表示排除语义右方括号pattern:]始终需要转义如果你要找这个符号本身。例如pattern:[-().^]直接匹配-()或^中任意一个字符// 无需转义 let regexp /[-().^]/g; alert( 1 2 - 3.match(regexp) ); // 匹配 和 -即便你多此一举全部转义结果也完全一致// 全部转义 let regexp /[\-\(\)\.\^\]/g; alert( 1 2 - 3.match(regexp) ); // 同样匹配 和 -6.2 代理对与标志u如果字符集内出现代理对surrogate pair如数学符号必须加上pattern:u标志才能正确匹配。默认情况下正则引擎不认识代理对会把[]当作四个半字符看待导致返回半个字符的奇怪结果alert( .match(/[]/) ); // 出现奇怪字符返回了半字符 alert( .match(/[]/u) ); // 正确结果范围[-]同理不加u会因起始编码大于结束编码而直接抛出Invalid regular expression错误加上u后正常工作见正文 article.md 的完整演示。七、总结四条必须记住的规则把本题和同章练习串起来可以归纳出四条直接影响匹配结果的核心规则字符集只消费一个字符[abc]或[^abc]无论列出多少字符都只对应结果中的一个字符位置不能匹配空^在方括号开头表示排除[^script]排除的是单个字符集合{s,c,r,i,p,t}不是单词script正则默认区分大小写没有i标志时S与s是不同字符这决定了JavaScript中的S能通过排除检查字符串末尾没有任何字符可供匹配排除型字符集同样必须匹配到一个真实字符因此Java结尾处直接失败。这四条规则同样适用于更复杂的字符集用法范围组合、字符类嵌入、排除型范围与\D/\S的等价关系、方括号内转义、代理对与u标志是你在 JavaScript 中使用正则进行文本搜索与替换时最需要夯实的地基。延伸阅读本仓库内正则表达式章节总览9-regular-expressions/index.md字符集与范围完整正文article.md本题题目与标准解答task.md、solution.md同章巩固练习2-find-time-2-formats/task.md字符类\d \w \s的详细讲解02-regexp-character-classes/article.md赞分享文档/教程前端【免费下载链接】en.javascript.infoModern JavaScript Tutorial项目地址https://gitcode.com/gh_mirrors/en/en.javascript.info点击查看免费下载相关推荐JavaScript 正则字符集与排除范围深入解析 /Java[^script]/ 的匹配陷阱JavaScript 正则字符集与排除范围深入解析 /Java ^script / 的匹配陷阱 导读 本文围绕本仓库《Modern JavaScript Tu文档/教程前端JavaScript 正则表达式教程字符集合与范围匹配JavaScript 正则表达式教程字符集合与范围匹配 什么是字符集合 在正则表达式中方括号 ... 表示一个字符集合它告诉正则引擎匹配其中任意一个字符文档/教程前端JavaScript正则表达式教程字符集合与范围匹配JavaScript正则表达式教程字符集合与范围匹配 你是否曾经遇到过这样的场景需要从复杂的文本中提取特定模式的字符但又不想为每个可能的字符都编写单独的模创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?