“学习JavaScript”第17章:正则表达式...后向引用示例失败

时间:2018-07-30 19:57:32

标签: javascript node.js regex null backreference

我目前正在阅读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'。有人有见识吗?

2 个答案:

答案 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)

看起来像书中的错误。

  1. 代码段中的正则表达式正在使用非捕获组:What is a non-capturing group? What does (?:) do?

这些不适用于反向引用。改用普通括号:

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?