javascript正则表达式问号(?)未检测到

时间:2015-09-03 12:47:03

标签: javascript regex

大家好我尝试用随机值创建一些regex

var data = "demo purpose?";  **OR**  var data = "demo purpose";
var sentence = "can I put these app as demo purpose?";
var re = new RegExp("\\b(" + data + ")\\b", "g");
console.log(sentence.match(re));   // output ["demo purpose"]

变量data中有两个不同的值demo purpose?& demo purpose只带问号。两个控制台都是相同的请任何一个给我提示我应该在这些情况下做什么。

- 谢谢

3 个答案:

答案 0 :(得分:11)

你需要逃避?(即写\\?)或it would be interpreted as a quantifier in regex

此外,\\b并不是必需的,因为它尝试匹配非空白字符,在这种情况下demo purpose?后面没有任何内容,因此sentence.match(new RegExp("\\b(demo purpose\\?)\\b", "g"))将返回null。

如果您想要随机性,请使用Math.random。创建一个数组并获得一个随机整数或0或1(带Math.floor)作为索引。

答案 1 :(得分:2)

为了在使用构造函数表示法时将变量传递给JS正则表达式,您需要转义所有充当正则表达式特殊字符的字符(量词,组分隔符等)。

MDN Web site可以使用escape功能:

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

另请注意,\b是一个单词边界,它会阻止匹配您需要的字符串,因为?是一个非单词字符。如果您不需要匹配字边界,请删除\b。如果您需要检查搜索字词是否为完整字词,请在开头使用(?:^|\W),在结尾使用(?!\w)并使用exec而不是match来获取被捕获的组1。

因此,您的代码将变为:

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

var data = "demo purpose?";
var sentence = "can I put these app as demo purpose?";
var re = new RegExp("(?:^|\\W)(" + escapeRegExp(data) + ")(?!\\w)", "g");
while ((m = re.exec(sentence)) !== null) {
   console.log(m[1]);   // output ["demo purpose?"]
}

如果您搜索emo purpose?,则不会返回任何结果,因为没有匹配项。

答案 2 :(得分:0)

这个

var data = "demo purpose?"; // **OR**  var data = "demo purpose";
var sentence = "can I put these app as demo purpose?";
var re = new RegExp(/demo purpose\?/, "g");
console.log(sentence.match(re));   // output ["demo purpose?"]

返回["演示目的?"], 将RegExp("xxx", "g");更改为RegExp(/xxx/, "g");

你可以做到

var data = /demo purpose\?/; // **OR**  var data = "demo purpose";
var sentence = "can I put these app as demo purpose?";
var re = new RegExp(data, "g");
console.log(sentence.match(re));   

您将获得相同的输出