【问题标题】:javascript Regex question mark (?) not detectjavascript 正则表达式问号 (?) 未检测到
【发布时间】:2015-09-03 12:47:02
【问题描述】:

大家好,我尝试用随机值创建一些 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,只有问号。两个控制台都是一样的,请任何人给我提示在这种情况下我应该怎么做。

- 谢谢

【问题讨论】:

  • 你期待什么? ? 表示 1 或 0 次出现前面的模式
  • 看看here,看看如何转义正则表达式特殊字符。
  • 如果通过demo purpose?,我希望输出应该是["demo purpose?"]
  • 您的搜索词是否以非词字符开头?你必须匹配整个单词吗?

标签: javascript regex


【解决方案1】:

你需要转义?(即写\\?)或者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)作为索引。

【讨论】:

  • data 值应该是随机的,我想要它["demo purpose?"]
  • @stribizhev 当我写下答案时,我只看了标题。我在阅读内容后更新了它。
  • @stribizhev 我不相信用勺子喂食。我想我已经给了他足够的线索,告诉他如何实现他想做的事情。
【解决方案2】:

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

escape 函数可在MDN Web site 获得:

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?,则不会返回任何结果,因为没有匹配项。

【讨论】:

    【解决方案3】:

    这个

    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?"]
    

    return ["演示目的?"], 将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));   
    

    你会得到相同的输出

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多