Javascript 从JS变量生成regexp不起作用

Javascript 从JS变量生成regexp不起作用,javascript,regex,Javascript,Regex,我试图从静态文本加上javascript中的变量构建一个regexp。显然,我缺少一些非常基本的东西,请参见下面代码中的注释。非常感谢您的帮助: var test_string = "goodweather"; // One regexp we just set: var regexp1 = /goodweather/; // The other regexp we built from a variable + static text: var regexp_part = "good";

我试图从静态文本加上javascript中的变量构建一个regexp。显然,我缺少一些非常基本的东西,请参见下面代码中的注释。非常感谢您的帮助:

var test_string = "goodweather";

// One regexp we just set: 
var regexp1 = /goodweather/;

// The other regexp we built from a variable + static text:
var regexp_part = "good";
var regexp2 = "\/" + regexp_part + "weather\/";

// These alerts now show the 2 regexp are completely identical:
alert (regexp1);
alert (regexp2);

// But one works, the other doesn't ??
if (test_string.match(regexp1))
  alert ("This is displayed.");

if (test_string.match(regexp2))
  alert ("This is not displayed.");

正斜杠只是用于将常规表达式括起来的Javascript语法。如果使用普通字符串作为正则表达式,则不应包含它们,因为它们将与正则表达式匹配。因此,您应该像这样构建正则表达式:

var regexp2 = regexp_part + "weather";
我将使用:

var regexp2 = new RegExp(regexp_part+"weather");
就像你所做的那样:

var regexp2 = "/goodweather/";
然后是:

test_string.match("/goodweather/")
使用字符串匹配,而不是您想要的正则表达式:

test_string.match(/goodweather/)
您应该使用构造函数来完成以下任务:

var regexp2 = new RegExp(regexp_part + "weather");
以下是一个可能会有所帮助的答案。

首先,回答这个问题:

其他答案几乎是正确的,但是没有考虑当匹配的文本包含字面反斜杠时会发生什么,即:ReExpExtEnter包含一个文字反斜杠。例如,当regexp_part等于:C:\Windows时会发生什么?在这种情况下,建议的方法无法按预期工作,结果正则表达式变为:/C:\Windows/,其中\W被错误地解释为非单词字符类。正确的解决方案是首先转义regexp\u部分中的任何反斜杠,所需的regex实际上是:/C:\\Windows/

为了说明正确的处理方法,下面是一个函数,它接受一个传递的短语并创建一个正则表达式,该短语用\b单词边界包装:

//给定一个短语,创建一个具有单词边界的RegExp对象。 函数makeRegexphase{ //首先对短语字符串中的任何反斜杠进行转义。 //即,用两个反斜杠替换每个反斜杠。 短语=短语。替换/\\/g,\\\\; //用\b单词边界包装转义短语。 var re_str=\\b+短语+\\b; //创建一个设置了g和i标志的新正则表达式对象。 var re=新的RegExpre_str,gi; 返回re; } //这是同一函数的浓缩版本。 函数makeRegExpShortphrase{ 返回新的RegExp\\b+短语。替换/\\/g、\\\\+\\b、gi; } 为了更深入地理解这一点,下面是一个讨论

深入讨论,或者这些反斜杠是怎么回事!? JavaScript有两种创建RegExp对象的方法:

/模式/标志-您可以直接指定一个RegExp文本表达式,其中使用一对前斜杠和三个模式修改器标志的任意组合来分隔模式:即“g”全局、“i”忽略大小写或“m”多行。无法动态创建此类型的正则表达式。 新的RegExppattern,flags-您可以通过调用RegExp构造函数来创建RegExp对象,并将模式作为字符串传递,而不使用正斜杠分隔符作为第一个参数,可选模式修改器标志也作为字符串作为第二个可选参数。这种类型的正则表达式可以动态创建。 下面的示例演示如何使用这两种方法创建一个简单的RegExp对象。假设我们希望匹配苹果这个词。我们需要的regex模式很简单:apple。此外,我们希望设置所有三个修改器标志

示例1:没有特殊字符的简单模式:apple 很简单。但是,这两种方法在处理转义字符方面存在显著差异。正则表达式文字语法非常方便,因为您只需要转义正斜杠-所有其他字符都会直接传递给正则表达式引擎,不作任何更改。但是,当使用RegExp构造函数方法时,将模式作为字符串传递,需要考虑两个级别的转义;第一个是字符串的解释,第二个是正则表达式引擎的解释。几个例子将说明这些差异

首先考虑一个包含单个文字向前斜线的模式。假设我们希望匹配文本序列:和/或以不区分大小写的方式。所需的模式是:和/或

示例2:具有一个正斜杠的模式:和/或 请注意,对于正则表达式文字语法,正斜杠必须在前面加上一个反斜杠进行转义,因为对于正则表达式文字,正斜杠具有特殊含义,它是一个用于分隔模式的特殊元字符。另一方面,对于使用字符串存储模式的RegExp构造函数语法,正斜杠没有任何特殊意义,也不需要转义

接下来,我们考虑一个模式,该模式包括一个特殊的:\b字边界正则表达式元。假设我们希望创建一个正则表达式来匹配整个单词apple,这样它就不会匹配菠萝。正则表达式引擎看到的模式需要是:\b示例\b:

示例3:具有\b单词边界的模式:\b示例\b 在这种情况下,在使用RegExp构造函数方法时必须转义反斜杠,因为模式存储在字符串中,要将文本反斜杠转换为字符串,必须将其转义为 这又是一个反斜杠。但是,对于正则表达式文字,不需要逃避反斜杠。请记住,对于正则表达式文字,唯一特殊的元字符是正斜杠

反斜杠汤! 当我们需要匹配文字反斜杠时,事情变得更加有趣。假设我们要匹配文本序列:C:\Program Files\JGsoft\RegexBuddy3\RegexBuddy.exe。要由正则表达式引擎处理的模式需要是:C:\\Program Files\\JGsoft\\RegexBuddy3\\RegexBuddy\.exe。请注意,匹配单个反斜杠的正则表达式模式为\\,即每个模式都必须转义。下面是如何使用两个JavaScript语法创建所需的RegExp对象

示例4:匹配文字反斜杠的模式: 这就是为什么/regex literal/语法通常比新的RegExppattern、flags方法更受欢迎的原因——它完全避免了经常出现的反斜杠。但是,当您需要动态创建正则表达式时,正如OP在这里所需要的那样,您必须使用新的正则表达式语法并处理反斜杠。一旦你把你的头缠在它身上,它就真的没那么糟糕了

雷格斯巴迪去营救!
是一个Windows应用程序,可以帮助解决此反斜杠汤问题-它了解许多语言的正则表达式语法和转义要求,并在粘贴到应用程序和从应用程序中粘贴时根据需要自动添加和删除反斜杠。在应用程序内部,您以本机正则表达式格式编写和调试正则表达式。一旦正则表达式正常工作,您可以使用许多副本中的一个将其导出为。。。获取所需语法的选项。非常方便

说到旗子,只有g在工作。我似乎从未工作过。有什么原因吗。我的正则表达式始终区分大小写,即使我有I标志
// A RegExp literal to match "apple" with all three flags set:
var re1 = /apple/gim;

// Create the same object using RegExp() constructor:
var re2 = new RegExp("apple", "gim");
// A RegExp literal to match "and/or":
var re3 = /and\/or/i;

// Create the same object using RegExp() :
var re4 = new RegExp("and/or", "i");
// A RegExp literal to match the whole word "apple":
var re5 = /\bapple\b/;

// Create the same object using RegExp() constructor:
var re6 = new RegExp("\\bapple\\b");
// A RegExp literal to match the ultimate Windows regex debugger app:
var re7 = /C:\\Program Files\\JGsoft\\RegexBuddy3\\RegexBuddy\.exe/;

// Create the same object using RegExp() constructor:
var re8 = new RegExp(
    "C:\\\\Program Files\\\\JGsoft\\\\RegexBuddy3\\\\RegexBuddy\\.exe");