Js ReGex非捕获组不工作

Js ReGex non-capturing group not working

本文关键字:工作 ReGex Js      更新时间:2023-09-26

我的问题是,我需要捕获一个脚本src,但我需要得到它只有当它有一个脚本标签src之前。

所以这里遵循我的正则表达式和选项我尝试

String: <script src="http://example.net"></script>
Regex: /(?:'<script[^]+src=("|'))([^]+)(?="|')/g
Match: <script src="http://example.net
第二选择:

String: <script src="http://example.net"></script>
Regex: /(?!'<script[^]+src=("|'))([^]+)(?="|')/g
Match: script src="http://example.net

我需要得到的是:http://example.net

我真的很感激你的帮助。

这是我用来测试的工具:http://www.regexr.com/

谢谢,

正则表达式不是解析HTML的正确工具,但是要解决这个问题,您可以在循环中使用exec()方法来获取所有子匹配,然后将捕获组的匹配结果推入数组。

var s = '<script src="http://foo.net"></script><script src="http://bar.com"></script>';
var re  = /<script[^>]+?src=['"]([^'"]+)['"]/g, 
matches = [];
while (m = re.exec(s)) {
  matches.push(m[1]);
}
console.log(matches) //=> [ 'http://foo.net', 'http://bar.com' ]

不确定您要做什么或从哪里得到该语法。

如果您想在所有script标签中获得src属性的值,为什么不只是搜索/<script[^>]*'ssrc="([^"]*)"/并检查第一个子表达式匹配。

这个语法[^]+,据我所知,只适用于旧版本的internet explorer (但可能也适用于新版本,你知道微软)和意味着所有不是什么(即一切),一次或几次

如果你想匹配所有的字符,直到标签的结尾和你想要的属性之前,你需要使用[^>]+?(如你所见)和一个延迟量词。

对于第二个丑陋的[^],由于它位于引号之间,您只需要将其替换为不包含引号的[^"']

您需要的结果不是整个匹配,而是捕获组的内容。

<script[^>]+?src=["']([^"']+)["']

给你一个开始:

/<script src='"(.*)(?='")/g

检索该表达式返回的第一个捕获组的值

以下是regexr.com的结果:

String: <script src="http://example.net"></script>
Regex: /(?:<script src=")([^"]+)/g
group#1: http://example.net

下面是javascript代码示例:

s = '<script src="http://example.net"></script>';
url = s.split(/(?:<script src=")([^"]+)/g)[1];

由于javascript不支持向后看断言,- AFAIK -你不能既匹配url,又检查url之前是否有一个脚本标签。因此,作为隐藏断言的替代方案,这是我所知道的最快和最简单的解决方案。