簡體   English   中英

正則表達式匹配除AND,OR和NOT之外的所有單詞

[英]regex to match all words but AND, OR and NOT

在我的javascript應用程序中,我有這個隨機字符串:

büert AND NOT 3454jhadf üasdfsdf OR technüology AND (bar OR bas)

我希望除了單詞ANDORNOT之外,還要匹配所有單詞的特殊字符和數字。

我試過這個

/(?!AND|OR|NOT)\\b[\À-\ſ\\w\\d]+/gi
結果
["büert", "3454jhadf", "asdfsdf", "technüology", "bar", "bas"]

但是這一次不匹配ü或AZ字母以外的其他任何字母開頭或因為一個字的結尾\\b字邊界。

刪除\\b奇怪地結束匹配部分或我想要排除的單詞:

/(?!AND|OR|NOT)[\À-\ſ\\w\\d]+/gi
結果是
["büert", "ND", "OT", "3454jhadf", "üasdfsdf", "R", "technüology", "ND", "bar", "R", "bas"]

除了我想要排除的字符外,無論它們包含什么類型的字符,匹配所有單詞的正確方法是什么?

這里的問題源於\\b (和\\w ,以及其他速記類)在JavaScript中不支持Unicode。

現在,有兩種方法可以達到你想要的效果。

1.分割你想要丟棄的圖案

 var re = /\\s*\\b(?:AND|OR|NOT)\\b\\s*|[()]/; var s = "büert AND NOT 3454jhadf üasdfsdf OR technüology AND (bar OR bas)"; var res = s.split(re).filter(Boolean); document.body.innerHTML += JSON.stringify(res, 0, 4); // = > [ "büert", "3454jhadf üasdfsdf", "technüology", "bar", "bas" ] 

請注意使用非捕獲組(?:...)以便不將不需要的單詞包含在結果數組中。 此外,您需要將所有標點符號和其他不需要的字符添加到字符類。

2.使用自定義邊界匹配

您可以在正則表達式中使用具有錨點/反向否定字符類的分組,如下所示:

(^|[^\u00C0-\u017F\w])(?!(?:AND|OR|NOT)(?=[^\u00C0-\u017F\w]|$))([\u00C0-\u017F\w]+)(?=[^\u00C0-\u017F\w]|$)

捕獲組2將保留您需要的值。

請參閱正則表達式演示

JS代碼演示:

 var re = /(^|[^\À-\ſ\\w])(?!(?:AND|OR|NOT)(?=[^\À-\ſ\\w]|$))([\À-\ſ\\w]+)(?=[^\À-\ſ\\w]|$)/gi; var str = 'büert AND NOT 3454jhadf üasdfsdf OR technüology AND (bar OR bas)'; var m; var arr = []; while ((m = re.exec(str)) !== null) { arr.push(m[2]); } document.body.innerHTML += JSON.stringify(arr); 

或者使用塊來動態構建正則表達式:

 var bndry = "[^\\\À-\\\ſ\\\\w]"; var re = RegExp("(^|" + bndry + ")" + // starting boundary "(?!(?:AND|OR|NOT)(?=" + bndry + "|$))" + // restriction "([\\\À-\\\ſ\\\\w]+)" + // match and capture our string "(?=" + bndry + "|$)" // set trailing boundary , "g"); var str = 'büert AND NOT 3454jhadf üasdfsdf OR technüology AND (bar OR bas)'; var m, arr = []; while ((m = re.exec(str)) !== null) { arr.push(m[2]); } document.body.innerHTML += JSON.stringify(arr); 

說明:

  • (^|[^\À-\ſ\\w]) - 我們的自定義邊界(匹配字符串以^開頭或[\À-\ſ\\w]范圍之外的任何字符)
  • (?!(?:AND|OR|NOT)(?=[^\À-\ſ\\w]|$)) - 對匹配的限制:如果存在ANDORNOT AND則匹配失敗字符串結尾或\À-\ſ范圍或非單詞字符以外的字符
  • ([\À-\ſ\\w]+) - 匹配單詞字符( [a-zA-Z0-9_] )或來自\À-\ſ范圍的\À-\ſ
  • (?=[^\À-\ſ\\w]|$) - 尾部邊界,字符串結尾( $ )或\À-\ſ范圍或非單詞字符以外的字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM