Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 开始时,按单词匹配。要视为和运算符的空间_Javascript_Regex - Fatal编程技术网

Javascript 开始时,按单词匹配。要视为和运算符的空间

Javascript 开始时,按单词匹配。要视为和运算符的空间,javascript,regex,Javascript,Regex,在一个庞大的字符串列表中,我需要帮助过滤。用户将键入几个字符,这些字符将用于执行每个单词的startsWith匹配。任何空白字符都应视为和运算符 比方说,如果用户键入Ad-Ade A,它应该匹配以Ad,Ade,A开头的字符串(顺序不重要)。用户键入的每个单词的字符串中应至少有一个startsWith匹配项 e、 g 1 Af Ele Ada 相配 "Adam likes African Elephants" "Test Adam Africa Elephant Africa Adam" "J

在一个庞大的字符串列表中,我需要帮助过滤。用户将键入几个字符,这些字符将用于执行每个单词的
startsWith
匹配。任何
空白
字符都应视为
运算符

比方说,如果用户键入
Ad-Ade A
,它应该匹配以
Ad
Ade
A
开头的字符串(顺序不重要)。用户键入的每个单词的字符串中应至少有一个
startsWith
匹配项

e、 g 1

Af Ele Ada
相配

"Adam likes African Elephants"
"Test Adam Africa Elephant Africa Adam"
"JunkCharacters Adenine Test1 Adam Test2 Abcd Test3"
但不匹配

Adam likes Australian Elephants (since no word starts with Af)
"Adam Adam Adam" (since no word is starting with Ade)
"Adenine" (since Ade matches Adenine and there are no matches for Ad and A).
e、 g.2

Ad Ade A
相配

"Adam likes African Elephants"
"Test Adam Africa Elephant Africa Adam"
"JunkCharacters Adenine Test1 Adam Test2 Abcd Test3"
但不匹配

Adam likes Australian Elephants (since no word starts with Af)
"Adam Adam Adam" (since no word is starting with Ade)
"Adenine" (since Ade matches Adenine and there are no matches for Ad and A).

是否可以为此匹配构造正则表达式?如果可能,最好使用一个正则表达式。

为每个标记使用一个正则表达式,
将结果组合在一起,如下所示:

string.match(/\bAd/) && string.match(/\bAde/) && string.match(/\bA/)
另外,根据搜索特性,你可以考虑建立一个单词索引。带索引的StartWith可以是一个非常快速的操作。有索引的O(logn)与没有索引的O(n)


关于索引的详细说明:

您可以构建反向索引。假设您拥有以下文件:

1 "Adam likes African Elephants"
2 "Test Adam Africa Elephant Africa Adam"
3 "Adam likes Australian Elephants"
4 "JunkCharacters Adenine Test1 Adam Test2 Abcd Test3"
您的反向索引如下所示:

Adam       1 2 3 4
African    1
Elephant   2
Elephants  1 3
likes      1 3
etc..
在该索引中,由于startsWith特性,您可以对您的令牌进行二进制搜索,这使得搜索速度非常快


不过,建立索引需要时间。因此,如果您的文档变化很大,或者文档相对较少,则可能不值得这样做。

使用lookaheads,您可以在单个正则表达式中这样做:

^(?=.*\b(Ade\w*)\b)(?=.*\b(?!\1)(Ad\w*)\b)(?=.*\b(?!\1|\2)(A\w*)\b).*

生成正则表达式的代码:

re.test("Adenine Adam Ball A")
true

re.test("Adenine")
false

re.test('JunkCharacters Adenine Test1 Adam Test2 Abcd Test3')
true
函数lookaheads(n){ var str=“”;
对于(i=1;i像这样的东西怎么样

console.log=函数(输入){
//用于堆栈溢出代码沙盒的jajack console.log()
var输出=JSON.stringify(输入);
var newli=document.querySelector(“#debug li[hidden]”)。cloneNode();
newli.removeAttribute(“隐藏”);
newli.innerHTML=输出;
document.querySelector('#debug').appendChild(newli);
};
var语句=[
“亚当喜欢非洲象”,
“测试亚当非洲大象非洲亚当”,
“JunkCharacters腺嘌呤测试1亚当测试2 Abcd测试3”,
“亚当”,
“腺嘌呤”
];
var goodMatch=函数(searchstring,sentance){
//确保所有搜索词至少匹配一个句子词
返回searchstring.split(/\s+/).every(函数(searchWord){
return sentance.split(/\s+/).some(函数(targetWord){
//确保搜索词具有长度,并基于该长度创建正则表达式
返回searchWord.length&&new RegExp('^'+searchWord.test)(targetWord);
});
});
};
var search=函数(searchstring){
返回语句。过滤器(函数(语句){
返回goodMatch(searchstring,sentance);
});
};
控制台日志(搜索(“Af Ele Ada”);
console.log(搜索(“Ad Ade A”);



1)感谢您的快速回答。是否可以使用一个正则表达式,而不是用户键入的每个单词都有一个正则表达式?2)您能否详细说明索引选项,这是一个好主意,希望了解更多。我不这么认为,因为正则表达式只能匹配一个单词一次。
a
Ad
Ade
h保持它们都与单词Adelle匹配的特征(例如)。此外,标记的顺序并不重要,这在正则表达式中是固定的,但会显著增加其复杂性。请使用
var s='Ad Ade a';
和测试字符串
Adenine Ae a
尝试此操作。此操作返回true,这是不正确的,因为
Ad
腺嘌呤
已与更具体的
Ade
匹配)根据我的Q
任何空白字符都应该被视为AND运算符。
也可以这样想,在我的用例中,我想帮助用户根据他们的输入过滤庞大的列表。如果用户键入了
Ade Ae
,一个只有
腺嘌呤的字符串有意义吗?很抱歉,我无法找到meaningful示例而不是
Ade Ae
,这本可以帮助更多。谢谢,这与我想要的非常接近。这与
Adam Adenine Adam
之类的字符串不匹配,但我可以对此进行改进。请更新答案,我会接受。此外,我认为用户提供的单词应该与重复的单词匹配,以便匹配
Adame> 两次不应该被视为匹配。谢谢,我已经这么做了,正在寻找一个神奇的正则表达式:)。如果不能找到这样的正则表达式,我无法说服自己,所以在这里发布了一个问题。