在JavaScript中使用字符串替换使用正则表达式引用嵌套组

由于jQuery处理脚本标记的方式,我发现有必要使用正则表达式来做一些HTML操作(是的,我知道......不是该作业的理想工具)。 不幸的是,似乎我理解捕获的组在JavaScript中的工作方式是有缺陷的,因为当我尝试这样做时:

var scriptTagFormat = /<script .*?(src="(.*?)")?.*?>(.*?)</script>/ig;

html = html.replace(
    scriptTagFormat, 
    '<span class="script-placeholder" style="display:none;" title="$2">$3</span>');

脚本标签被替换为跨度,但结果title属性为空。 $2与脚本标签的src属性的内容匹配?


小组嵌套是无关紧要的; 它们的编号严格按正则表达式中的开括号的位置确定。 就你而言,这意味着它是捕获整个src="value"序列的组#1,捕获value部分的组#2。


尝试这个:

/<script (?:(?!src).)*(?:src="(.*?)")?.*?>(.*?)</script>/ig

看到这里:红宝石

正如stema写道的那样.*? 匹配太多。 使用负向预测(?:(?!src).)*只会匹配到src属性。

但实际上在这种情况下,你也可以移动.*? 进入可选部分:

/<script (?:.*?src="(.*?)")?.*?>(.*?)</script>/ig

看到这里:红宝石


.*? 匹配太多,因为下面的组是可选的,==>你的src是从.*?一个匹配的.*? 周围。 如果你删除? 在您的第一个小组之后它工作。

更新:由于@morja指出你的解决方案是移动第一个.*? 进入可选的src部分。

为了完整性: /<script (?:.*?(src="(.*?)"))?.*?>(.*?)</script>/ig

你可以在这里看到它在rubular(更正我的链接也)

如果您不想使用第一个捕获组的内容,请使用(?:)将其设为非捕获组

/<script (?:.*?(?:src="(.*?)"))?.*?>(.*?)</script>/ig

然后你想要的结果是1美元和2美元。

链接地址: http://www.djcxy.com/p/74809.html

上一篇: Referencing nested groups in JavaScript using string replace using regex

下一篇: Named capturing groups in JavaScript regex?