匹配双引号或单引号之间的文字

时间:2016-03-08 09:07:41

标签: javascript regex

我需要一些正则表达式的帮助。最近几个小时我一直在敲打我的脑袋。我需要在缩小的文件中匹配一些字符串。

示例字符串:

var a ='abc'; var b = 'http://a/that.dude.js/v1/'; var c = 'def'; var d = 'https://b/that.dude.js/v1/';
var basePath = "http://othersite/that.dude.js/v1/";

我希望在包含that.dude.js/v1的单引号或双引号内匹配全文。我试过了:

/('|").+that.dude.js\/v1\/('|")/g

...但是当同一行中出现多次时,这与整行匹配。

我的预期匹配将是:

http://a/that.dude.js/v1/
https://b/that.dude.js/v1/
http://othersite/that.dude.js/v1/

以下是我尝试过的内容:http://regexr.com/3cv62

2 个答案:

答案 0 :(得分:2)

试试这个:

/(["'])[^"']+that\.dude\.js\/v1\/\1/g

唯一的修改是将.更改为[^"']这不允许引号之间的引号。

答案 1 :(得分:2)

如果双引号字符串中有单引号,则需要捕获引号分隔符并使用反向引用来匹配完全相同的尾部分隔符:

(['"])([^"'\s]*that\.dude\.js\/v1[^"'\s]*)\1

请参阅regex demo

由于您有网址,因此您可以安全地将其与[^"'\s]*(除"'和空白之外的一个或多个符号相匹配)。正则表达式匹配:

  • (['"]) - 主要引号分隔符(捕获到第1组,以便我们可以匹配相同的尾随分隔符)
  • ([^"'\s]*that\.dude\.js\/v1[^"'\s]*) - 第2组匹配
    • [^"'\s]* - 除"'和空格以外的0 +个符号
    • that\.dude\.js\/v1 - that.dude.js/v1
    • [^"'\s]* - 同上。
  • \1 - 与前导分隔符相同的尾随分隔符

结果将在第2组:



var re = /(['"])([^"'\s]*that\.dude\.js\/v1[^"'\s]*)\1/g; 
var str = 'var a =\'abc\'; var b = \'http://a/that.dude.js/v1/\'; var c = \'def\'; var d = \'https://b/that.dude.js/v1/\';\nvar basePath = "http://othersite/that.dude.js/v1/";';
var res = [];
 
while ((m = re.exec(str)) !== null) {
  res.push(m[2]);
}
document.body.innerHTML = "<pre>" + JSON.stringify(res, 0, 4) + "</pre>";
&#13;
&#13;
&#13;

请注意,要使其更通用,您可以使用淬火贪婪令牌

(['"])((?:(?!\1).)*that\.dude\.js\/v1(?:(?!\1).)*)\1
       ^^^^^^^^^^^^                  ^^^^^^^^^^^^  

请参阅another demo

(?:(?!\1).)令牌将匹配任何字符,但换行符不等于\1反向引用所引用的值。