【问题标题】:RegExp using regex + variables使用正则表达式 + 变量的正则表达式
【发布时间】:2014-07-22 13:55:59
【问题描述】:

我知道关于正则表达式中的变量有很多问题。其中一些例如:

不幸的是,他们都没有详细解释如何逃避我的 RegExp。

假设我想查找前面有这个字符串的所有文件:

file:///storage/sdcard0/

我用正则表达式试过这个:

(?:file:\/\/\/storage\/sdcard0\(.*))(?:\"|\')

在某些 json 文件中正确获取了我的 image1.jpg 和 image2.jpg。 (尝试使用http://regex101.com/#javascript

在我的一生中,我无法让它在 JS 中工作。我知道你应该使用RegExp 来解决这个问题,但我遇到了问题。

var findStr =  "file:///storage/sdcard0/";
var regex =  "(?:"+ findStr +"(.*))(?:\"|\')";
var re = new RegExp(regex,"g"); 
var result = <mySearchStringVariable>.match(re);

有了这个我得到 1 个结果,它是错误的(一堆文本)。我认为我应该像网络上所说的那样逃避这个。我试图用下面的两个函数逃避 findStr,结果是一样的。所以我想好吧,我也需要在正则表达式中转义一些字符。

我试图手动转义它们,结果没有匹配。

我尝试在将整个正则表达式变量传递给 RegExp 构造函数之前对其进行转义,结果是相同的:没有匹配项。

function quote(regex) {
  return regex.replace(/([()[{*+.$^\\|?])/g, '\\$1');
}   

function escapeRegExp(str) {
    return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}   

请问我到底做错了什么?

有没有关于如何编写带有变量的 RegExp 的好的文档?

【问题讨论】:

  • 为什么要在模式末尾包含引号字符?这对我来说没有意义。
  • 引号是我匹配的结束字符,我想停止匹配的点..
  • 实际上你的正则表达式对我来说效果很好。您将不得不发布更多详细信息。
  • 当我执行"foo bar file:///storage/sdcard0/'".match(re) 时,我得到了正确的结果,换句话说 - 只是文件 URL 而不是“foo bar”。
  • 啊啊啊——我想通了!!我需要将 LAZY 与 (.*?) 一起使用,这该死的以前从未想过

标签: javascript regex string


【解决方案1】:

我需要做的就是使用 LAZY 而不是 greedy with

var regex =  "(?:"+ findStr +"(.*?))(?:\"|\')"; // added ? in (.*?)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-13
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多