[英]regex to match all words but AND, OR and NOT
在我的javascript應用程序中,我有這個隨機字符串:
büert AND NOT 3454jhadf üasdfsdf OR technüology AND (bar OR bas)
我希望除了單詞AND
, OR
和NOT
之外,還要匹配所有單詞的特殊字符和數字。
我試過這個
/(?!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。
現在,有兩種方法可以達到你想要的效果。
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" ]
請注意使用非捕獲組(?:...)
以便不將不需要的單詞包含在結果數組中。 此外,您需要將所有標點符號和其他不需要的字符添加到字符類。
您可以在正則表達式中使用具有錨點/反向否定字符類的分組,如下所示:
(^|[^\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]|$))
- 對匹配的限制:如果存在AND
或OR
或NOT
AND
則匹配失敗字符串結尾或\À-\ſ
范圍或非單詞字符以外的字符 ([\À-\ſ\\w]+)
- 匹配單詞字符( [a-zA-Z0-9_]
)或來自\À-\ſ
范圍的\À-\ſ
(?=[^\À-\ſ\\w]|$)
- 尾部邊界,字符串結尾( $
)或\À-\ſ
范圍或非單詞字符以外的字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.