Javascript: Check for an array of keywords match in a string

檢查某字串必須符合陣列中某一關鍵字。

範例1 RegExp: or logic

const animals = ["dog", "fish", "bird", "cat"];
const regex = new RegExp(animals.join("|")) // animals seperated by a pipe "|"

if (regex.test("I love cats")) {
  console.log("Yes");
}

// if you don't want to create an array then:
if (/dog|fish|bird|cat/.test("I love elephants")) {
  console.log("Yes");
}

範例2 RegExp: and logic

function buildRegEx(str, keywords){
  return new RegExp("(?=.*?\\b" + 
    keywords
      .split(" ")
      .join(")(?=.*?\\b") +                     
    ").*", 
    "i"
  );
}

function test(str, keywords, expected){
  var result = buildRegEx(str, keywords).test(str) === expected
  console.log(result ? "Passed" : "Failed");
}

// Same order and have all keywords 
test("Hello world!", "hello world", true);
// Same order and have all keywords 
test("Hello all in the world!", "hello world", true);
// Any order but have all keywords 
test("Hello world!", "world hello", true);
// Same order and all keywords 
test("Hello world!", "worl hell", true);
// Have all keywords in any order 
test("Hello world!", "world", true);
// No contains all keywords 
test("Hello world!", "where you go", false);
// No contains all keywords
test("Hello world!", "z", false);
// No contains all keywords 
test("Hello world!", "z1 z2 z3", false);
// Contains all keywords in any order 
test("Hello world!", "wo", true);

RegExp 比較難理解一點,下面 indexOf 就簡單一點點:

const keyword_array = area_keyword.split(" ");
let contain = true;
for(var j = 0; j < keyword_array.length; j++){
    if(keyword_array[j] == "") continue;
    if (html_text.indexOf(keyword_array[j]) == -1) {
        contain = false
        break;
    }
}                    
if (contain) {
    // bingo~
}

RegExp 常見用法:

  • \ 反斜線放在非特殊符號前面,使非特殊符號不會被逐字譯出,代表特殊作用。 例如:’b’ 如果沒有 ‘\’ 在前頭,功能是找出小寫 b;若改為 ‘\b’ 則代表的是邊界功能,block 用意。 /\bter\b/.test(“interest”) //false /\bter\b/.test(“in ter est”) //true /a/ 找出 0 個或是 1 個以上的 a;而 /a*/ 找出 ‘a‘ 這個字串 /aaaa*/g.test(“caaady”) //true /a*/.test(“caaady”) //false ‘\’ 也能使自身表現出來,表現 ‘\’ ,必須以 ‘\’ 表達。 /[\]/.test(“>\<“) //true
  • ^ 匹配輸入的開頭,如果 multiline flag 被設為 true,則會匹配換行字元後。例如:/^A/ 不會匹配「an A」的 A,但會匹配「An E」中的 A。「^」出現在字元集模式的字首中有不同的意思,詳見補字元集。
  • $ 匹配輸入的結尾,如果 multiline flag 被設為 true,則會匹配換行字元。例如:/t$/ 不會匹配「eater」中的 t,卻會匹配「eat」中的 t。
  • * 匹配前一字元 0 至多次。 下面舉例要求基本 ‘aaaa’ ,’a‘ 後面有 0 個或多個 a 的意思 /aaaaa/g.test(“caaady”) //false 例如:/bo*/ 匹配「A ghost booooed」中的 boooo、「A bird warbled」中的 b,但在「A goat grunted」中不會匹配任何字串。
  • + 匹配前一字元 1 至多次,等同於 {1,}。例如:/a+/ 匹配「candy」中的 a,以及所有「caaaaaaandy」中的 a。
  • ? 匹配前一字元 0 至 1 次,等同於 {0,1}。例如:/e?le?/ 匹配「angel」中的 el、「angle」中的 le、以及「oslo」中的 l。如果是使用在 *、+、? 或 {} 等 quantifier 之後,將會使這些 quantifier non-greedy(也就是儘可能匹配最少的字元),與此相對的是 greedy(匹配儘可能多的字元)。例如:在「123abc」中應用 /\d+/ 可匹配「123」,但使用 /\d+?/ 在相同字串上只能匹配「1」。 Also used in lookahead assertions, as described in the x(?=y) and x(?!y) entries of this table.
    . (小數點)匹配除了換行符號之外的單一字元。例如:/.n/ 匹配「nay, an apple is on the tree」中的 an 和 on,但在「nay」中沒有匹配。
  • x|y 符合「x」或「y」。舉例來說,/green|red/ 的話,會匹配 “green apple” 中的 “green” 以及 “red apple.” 的 “red” 。
  • {n} 規定符號確切發生的次數,n 為正整數例如:/a{2}/無法在 “candy” 找到、但 “caandy” 行;若字串擁有 2 個以上 “caaandy” 還是只會認前面 2 個。
  • {n,m} 搜尋條件:n 為至少、m 為至多,其 n、m 皆為正整數。若把 m 設定為 0,則為 Invalid regular expression。例如:/a{1,3}/無法在 “cndy” 匹配到;而在 “candy” 中的第 1 個”a”符合;在 “caaaaaaandy” 中的前 3 個 “aaa” 符合,雖然此串有許多 a,但只認前面 3 個。
  • [xyz] 字元的集合。此格式會匹配中括號內所有字元, including escape sequences。特殊字元,例如點(.) 和米字號(*),在字元集合中不具特殊意義,所以不需轉換。若要設一個字元範圍的集合,可以使用橫線 “-” ,如下例所示: [a-d] 等同於 [abcd]。會匹配 “brisket” 的 “b” 、”city” 的 ‘c’ ……等。 而/[a-z.]+/ 和 /[\w.]+/ 均可匹配字串 “test.i.ng” 。


範例3 some:

You can create an array of keywords and use some to check if at least one of them exists in the string.

const caption = "I love dogs";
const animals = ["dog", "fish", "bird", "cat"];
const exists = animals.some(animal => caption.includes(animal))

if (exists) {
  console.log("Yes");
  // notify 
}

資料來源

Javascript: Check for an array of keywords match in a string
https://stackoverflow.com/questions/54900214/javascript-check-for-an-array-of-keywords-match-in-a-string

How to check if contains all keywords in any order of string? RegExp Javascript
https://stackoverflow.com/questions/41748030/how-to-check-if-contains-all-keywords-in-any-order-of-string-regexp-javascript

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *