Js ReGex非捕获组无法正常工作

时间:2014-08-15 20:09:35

标签: javascript regex

我的问题是,我需要捕获一个脚本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/

谢谢,

5 个答案:

答案 0 :(得分:1)

正则表达式不是解析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' ]

答案 1 :(得分:0)

据我所知,此语法[^]+仅适用于旧版本的Internet Explorer (但也许适用于较新版本,您知道微软)并且意味着所有这些并非一无所有(即一切),一次或多次

如果要匹配所有字符,直到标记的结尾和所需的属性之前,您需要使用惰性量词[^>]+?(如您所见)。

对于第二个丑陋的[^],由于它位于引号之间,因此您只需将其替换为排除引号的[^"']

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

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

答案 2 :(得分:0)

不确定您正在尝试做什么或在哪里获得该语法。

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

答案 3 :(得分:0)

这是你的开始:

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

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

答案 4 :(得分:0)

这是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不支持lookbehind断言, - AFAIK - 您不能只匹配url并检查url之前是否有脚本标记。因此,作为lookbehind断言的替代方案,这是我所知道的最快速,最简单的解决方案。