2015-09-03 35 views
4

大家好我试图用随机值创建一些regexjavascript正则表达式问号(?)没有检测到

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仅问号。两个控制台都是同样请任何一个给我暗示我应该怎么做在这种情况下。

- 谢谢

+0

你期望什么? '?'表示* 1或0出现前面的模式*。 –

+0

看看[这里](http://stackoverflow.com/questions/2593637/how-to-escape-regular-expression-in-javascript),看看你如何逃避正则表达式的特殊字符。 – npinti

+0

我想,因为它是通过'演示目的?'比输出应该是'[“演示的目的?“]' – higunjan

回答

10

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

+0

'data'值应该是自带的随机,我希望它'[”演示目的是什么?“]' – higunjan

+0

@stribizhev我只当我写下答案时阅读标题,我在阅读内容后更新了它 –

+0

@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?,没有结果将被退回,因为会有不匹配。

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)); 

,你会得到相同的输出