2017-06-23 42 views
0

好的,所以我知道如何做一個標準循環遍歷字符串來查找匹配單個字符或單詞的字符或單詞,但在這種情況下,我有我正在尋找多個字符集。一些是字母,一些是字符(包括保護字符)。我不能將它分成空間或任何類似的字詞數組,因爲字符集可能沒有空格,所以不會分割。我懷疑我將不得不做一個正則表達式,但我不知道如何設置它。這基本上是我試圖做的僞代碼,我會很感激關於如何前進的任何提示。我很抱歉,如果這是一件容易的事情,我錯過了它,我仍在工作我的JavaScript。Javascript迭代尋找多個字符集的字符串

僞代碼:

var string = "This *^! is abdf random&!# text to x*?ysearch for character sets"; 
var tempSet = []; 

// start a typical for loop 
for(string.length bla bla...){ 
    // look for one of those four character sets and if it hits one 
    if(foundSet == "abdf" | "x*?y" | "*^!" | "&!#") 
    // push that character set to the tempSet array 
    tempSet.push(foundSet); 
    // continue searching for the next set until the string is done 

console.log(tempSet); 
//expected result = ["*^!", "abdf", "&!#", "x*?y"] 

,所有的集合是在其出現的字符串

的順序排列在那裏,顯然更多,但是這部分我可以處理。這是這條線

if(??? == "abdf" | "x*?y" | "*^!" | "&!#") 

我不知道如何處理。我懷疑它應該是某種類型的正則表達式,但是你可以像這樣使用一個正則表達式在做if語句時?我用一個|來完成它們當做一個地圖/替換,但我從來沒有在循環中使用正則表達式。我也不知道如何讓它一次搜索多個角色。一些字符集是3,一些是4個字符長。

我將不勝感激任何幫助,或者如果您有關於如何以更簡單的方式來解決這個問題的建議,那將是非常棒的。

謝謝!

回答

1

您可以使用正則表達式。只需列出您的所有字符串作爲|分隔的替代品。在正則表達式中具有特殊含義的字符(例如*,?,^,$)需要用\(您可以安全地轉義任何非字母數字字符 - 有些字符是多餘的)進行轉義。

var string = "This *^! is abdf random&!# text to x*?ysearch for character sets"; 
 
var tempSet = string.match(/abdf|x\*\?y|\*\^!|&!#/g); 
 

 
console.log(tempSet);

如果你需要一個循環,你可以在一個循環中調用RegExp.prototype.exec()

var string = "This *^! is abdf random&!# text to x*?ysearch for character sets"; 
 
var regex = /abdf|x\*\?y|\*\^!|&!#/g; 
 
var tempSet = []; 
 
while (match = regex.exec(string)) { 
 
    tempSet.push(match[0]); 
 
} 
 
console.log(tempSet);

+0

謝謝,這是一個很大的幫助。我必須把它放在一個循環中,因爲其他的東西需要根據發現的來完成,但是這個正則表達式給了我一個工作的起點。謝謝! – MandyM

+0

如果您需要循環,請查看'RegExp.exec()'方法來重複執行正則表達式並獲取下一個匹配項。 – Barmar

+0

太好了,謝謝。我會檢查出來的! – MandyM

1

我想你正在尋找的是includes()函數。

var sample = "This *^! is abdf random&!# text to x*?ysearch for character 
sets"; 
var toSearch = ["*^!", "abdf", "&!#", "x*?y"]; 
var tempSet = []; 

for (var i = 0; i < toSearch.length; i++) { 
    if (sample.includes(toSearch[i]){ 
     tempSet.push(toSearch[i]); 
    } 
} 

console.log(tempSet); 
//expected result = ["*^!", "abdf", "&!#", "x*?y"] 

通過這種方式,您可以遍歷整個要搜索的任何字符串的數組,並將所有匹配元素推送到tempSet。

注意:這是區分大小寫,所以請確保您考慮相應的檢查。

+0

謝謝!我會玩這個。我把它放到jsfiddle中,我得到一個「未捕獲的SyntaxError:無效或意外的令牌」,所以我會看看如果我能弄清楚。 :) – MandyM

+0

這是非常可能的,我犯了一個語法錯誤,希望那點你在正確的方向! – Kevin

+0

是的,它給了我一個開始,謝謝! – MandyM

1

超過Barmar出色的正則表達式的手動方法的位,但它是有趣的放在一起,並展示了作品也許更多一點明確:

var text = "This *^! is abdf random&!# text to x*?ysearch for character sets", 
 
    detect = ["abdf", "x*?y", "*^!", "&!#"], 
 
    haystack = '', 
 
    found = []; 
 

 
text.split('').forEach(function(letter){ 
 
    haystack += letter; 
 
    detect.forEach(function(needle){ 
 
     if (haystack.indexOf(needle) !== -1 
 
      && found.indexOf(needle) === -1) { 
 
      found.push(needle); 
 
     } 
 
    }); 
 
}); 
 

 
console.log(found);

+0

謝謝。我很高興今晚能爲你提供一些樂趣。 :) – MandyM