[英]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.