2015-09-03 33 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)); 

,你會得到相同的輸出