簡體   English   中英

正則表達式“AND”

[英]Regular Expression “AND”

我正在從輸入中進行一些基本的文本匹配。 我需要能夠執行基本的“AND”。 對於“ANY”,我用空格分割輸入並用管道(“|”)字符連接每個單詞,但我還沒有找到一種方法來告訴正則表達式匹配任何單詞。

switch (searchOption) {
  case "any":
    inputArray = input.split(" ");
    if (inputArray.length > 1) { input = inputArray.join("|"); }
    text = input;
    break;
  case "all":
    inputArray = input.split(" ");
    ***[WHAT TO DO HERE?]***
    text = input;
    break;
  case "exact":
    inputArray = new Array(input);
    text = input;
    break;
}

好像它應該很容易。

使用前瞻 嘗試這個:

if( inputArray.length>1 ) rgx = "(?=.*" + inputArray.join( ")(?=.*" ) + ").*";

你最終會得到類似的東西

(?=.*dog)(?=.*cat)(?=.*mouse).*

只有在出現所有單詞時才能匹配,但它們可以按任何順序排列

  • 狗吃了吃老鼠的貓。
  • 老鼠被狗和貓吃掉了。
  • 大多數貓喜歡鼠標和狗。

但不是

  • 老鼠的狗。
  • 像小鼠一樣的貓和狗。

它的工作方式是正則表達式引擎從當前匹配點(0)掃描,查找.*dog ,第一個子正則表達式(任意數字的任意數字,然后是dog )。 當它確定該正則表達式的真實性時,它會重置匹配點(返回0)並繼續下一個子正則表達式。 因此,網絡是每個單詞的位置並不重要; 只有找到每個單詞。

編輯:@Justin指出我應該有一個尾隨.* ,我在上面添加了。 沒有它, text.match(regex)可以工作,但是regex.exec(text)返回一個空匹配字符串。 使用尾隨.* ,您將獲得匹配的字符串。

做一個簡單的for循環並搜索每個術語,如下所示:

var n = inputArray.length;
if (n) {
    for (var i=0; i<n; i++) {
        if (/* inputArray[i] not in text */) {
            break;
        }
    }
    if (i != n) {
        // not all terms were found
    }
}

“和”的問題是:你想要的是什么組合? 它們可以按任何順序出現,還是必須按照給定的順序出現? 它們可以連續出現還是之間可以有其他單詞?

這些決定會嚴重影響您的搜索(或搜索)。

如果你正在尋找“ABC”(按順序,連續),表達式只是/ABC/ 完成!

如果您正在尋找“A foo B bar C”,可能是/A.*?B.*?C/

如果你正在尋找“B foo A foo C”你最好為/A//B//C/做三個單獨的測試

我的正則表達式cookbook確實具有正則表達式,可以使用條件來實現。 但是,它非常復雜,所以我會選擇當前最受歡迎的答案,它會迭代選項。 無論如何,試圖調整他們的例子我認為它將是這樣的:

\b(?:(?:(word1)|(word2))(\b.*?)){2,}(?(1)|(?!))(?(2)|(?!))

不能保證這個按原樣工作,但這是我認為的基本想法。 看看我的意思是復雜的?

暫無
暫無

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

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