在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