我目前正在阅读Ethan Brown(2016)的“ Learning JavaScript”。我正在浏览“反向引用”部分中的示例,并且它们始终显示为“ null”。有两个例子。
示例1:匹配格式为XYYX的名称。
const promo = "Opening for XAAX is the dynamic GOOG! At the box office now!";
const bands = promo.match(/(?:[A-Z])(?:[A-Z])\2\1/g);
console.log('bands: '+ bands);//output was null
如果我正确理解了文字,结果应该是...
bands: XAAX, GOOG
示例2:匹配单引号和/或双引号。
//we use backticks here because we're using single and
//double quotation marks:
const html = `<img alt='A "simple" example,'>` +
`<img alt="Don't abuse it!">`;
const matches = html.match(/<img alt=(?:['"]).*?\1/g);
console.log('matches: '+ matches);//output was null
同样,如果我正确理解文本,则结果不应为“ null”。文字没有确切说明结果应该是什么。
我不知所措,试图弄清楚为什么当我在Node.js中运行它时,对于这两个示例,它总是给我'null'。有人有见识吗?
答案 0 :(得分:2)
问题是您所在的小组在那里
(?:['"])
?:
表示这是一个不捕获的组-这意味着您不能向后引用该组(或在match
结果中获取该组)。改用普通括号表示应该捕获该组:
const html = `<img alt='A "simple" example,'>` +
`<img alt="Don't abuse it!">`;
const matches = html.match(/<img alt=(['"]).*?\1/g);
console.log('matches: '+ matches);
答案 1 :(得分:0)
看起来像书中的错误。
这些不适用于反向引用。改用普通括号:
const promo = "Opening for XAAX is the dynamic GOOG! At the box office now!";
const bands = promo.match(/([A-Z])([A-Z])\2\1/g);
console.log('bands: '+ bands);//output was null
其他示例也是如此...
更新:我已经检查了原始来源(第3版),并可以确认:所有样本都是错误的,并且使用的是非捕获组。
顺便说一句:作者写道:
分组可启用另一种称为反向引用的技术。在我的 经验,这是最少使用的正则表达式功能之一,但是有 一个实例派上用场。 ...
我认为我唯一一次需要使用反向引用(其他 而不是解决难题)匹配的引号。在HTML中,您可以 对属性值使用单引号或双引号。
然后遵循OP中显示的HTML regex示例。 Cthulhu is calling?