在javascript中测试两个字符串之间的公共单词
我必须匹配两个字符串,其中至少有一个词是相同的,我需要给一个成功的消息在javascript中测试两个字符串之间的公共单词,javascript,string,pattern-matching,Javascript,String,Pattern Matching,我必须匹配两个字符串,其中至少有一个词是相同的,我需要给一个成功的消息 var str1 = "Hello World"; var str2 = "world is beautiful"; 我需要匹配/比较这两个字符串,在这两个字符串中,世界是匹配的,所以我需要打印一条成功消息。如何执行此操作。以下代码将输出两个字符串中的所有匹配单词: var words1 = str1.split(/\s+/g), words2 = str2.split(/\s+/g), i, j;
var str1 = "Hello World";
var str2 = "world is beautiful";
我需要匹配/比较这两个字符串,在这两个字符串中,世界是匹配的,所以我需要打印一条成功消息。如何执行此操作。以下代码将输出两个字符串中的所有匹配单词:
var words1 = str1.split(/\s+/g),
words2 = str2.split(/\s+/g),
i,
j;
for (i = 0; i < words1.length; i++) {
for (j = 0; j < words2.length; j++) {
if (words1[i].toLowerCase() == words2[j].toLowerCase()) {
console.log('word '+words1[i]+' was found in both strings');
}
}
}
var words1=str1.split(/\s+/g),
words2=str2.split(/\s+/g),
我
J
对于(i=0;i
类似的操作也可以:
isMatching = function(str1, str2) {
str2 = str2.toLowerCase();
for (var i = 0, words = str1.toLowerCase().match(/\w+/g); i < words.length; i++) {
if (str2.search(words[i]) > -1) return true;
}
return false;
};
var str1 = "Hello World";
var str2 = "world is beautiful";
isMatching(str1, str2); // returns true
isMatching(str1, 'lorem ipsum'); // returns false
isMatching=函数(str1、str2){
str2=str2.toLowerCase();
for(var i=0,words=str1.toLowerCase().match(/\w+/g);i-1)返回true;
}
返回false;
};
var str1=“你好世界”;
var str2=“世界是美丽的”;
i匹配(str1,str2);//返回true
isMatching(str1,“lorem ipsum”);//返回false
通过对每个列表进行排序并消除重复项,可以避免将一个列表中的所有单词与另一个列表中的所有单词进行比较。改编:
这里的排序(与任何集合一样)是在字数n插入集合O(n log n)时进行的,然后交集(&)在集合长度m上是有效的O(m)。只需使用真实位掩码调整@Phil H的代码即可:
var strings = ["Hello World", "world is beautiful"]; // up to 32 word lists
var occurrences = {},
result = [];
for (var i=0; i<strings.length; i++) {
var words = strings[i].toLowerCase().split(/\s+/),
bit = 1<<i;
for (var j=0, l=words.length; j<l; j++) {
var word = words[j];
if (word in occurrences)
occurrences[word] |= bit;
else
occurrences[word] = bit;
}
}
// now lets do a match for all words which are both in strings[0] and strings[1]
var filter = 3; // 1<<0 | 1<<1
for (var word in occurrences)
if ((occurrences[word] & filter) === filter)
result.push(word);
var strings=[“你好,世界很美”];//最多32个单词列表
变量出现次数={},
结果=[];
对于(var i=0;i我刚刚试过这个,它在那里工作:
var s1 = "hello world, this is me";
var s2 = "I am tired of this world and I want to get off";
var s1s2 = s1 + ";" + s2;
var captures = /\b(\w+)\b.*;.*\b\1\b/i.exec(s1s2);
if (captures[1])
{
document.write(captures[1] + " occurs in both strings");
}
else
{
document.write("no match in both strings");
}
好的,简单的方法是:
function isMatching(a, b)
{
return new RegExp("\\b(" + a.match(/\w+/g).join('|') + ")\\b", "gi").test(b);
}
isMatching("in", "pin"); // false
isMatching("Everything is beautiful, in its own way", "Every little thing she does is magic"); // true
isMatching("Hello World", "world is beautiful"); // true
…明白吗
基本上,我将“Hello,World!”
转换为正则表达式/\b(Hello | World)\b/gi
来解释一下简单的代码,我们得到两个单独单词的列表,并将第一个列表中的每个单词与第二个列表中的每个单词进行比较。这需要O(n^2)比较平均字数n.您可能希望在if语句中添加一个i++
和break
。完整单词还是部分单词?是否“世界”与“世界”匹配还是不?你为什么不直接分配3个呢?@Amberlamps:当然,没什么区别。只是想说明一下情况constructed@Bergi:Niiice.我想对于更多字符串,您可以对32个字符串的组执行此操作,然后&
将这些组组合在一起,并进行多阶段检查以进行最终比较。或者使用I/32
索引into列出了出现次数的值。
。顺便说一句,出现次数有两个rs。@PhilH:谢谢你的提示,我的英语还在增长:)顺便说一句,分数不会像JS对32位整数做所有位运算那样工作哇,谈论过早优化…;)不过很好answer@WTK:是的,如果你在一个字符串中有几个单词,那就太过分了,但是你永远不知道提问者是否想用长字符串来回答这个问题,或者其他人在解决他们自己(更大)的问题时是否会看到这个问题。我不想让bjornd的答案自己留下,因为它是O(n^2),而要找到完整的常用词集,它的成本要高得多。做这些事情很有趣。当然,当然-我不是有意批评的。我同意,你永远不知道人们在看什么,所以最好提供各种各样的好答案:)@WTK:的确如此。我并不是想说你指出这一点是错误的,这在大多数情况下肯定是过分的,特别是在javascript中,你不太可能遇到大n@玛杜:这将匹配“in”和“pin”例如,不?酷!由于贪婪的匹配,即使分号也是安全的+1.这种方法的一个缺点是必须选择一个已知不会出现在任何行中的分隔符字符串。另外,我不确定是否到处都支持\1
反向引用和\b
单词边界匹配。。。。然后我注意到@reinierpost已经这样做了!
var s1 = "hello world, this is me";
var s2 = "I am tired of this world and I want to get off";
var s1s2 = s1 + ";" + s2;
var captures = /\b(\w+)\b.*;.*\b\1\b/i.exec(s1s2);
if (captures[1])
{
document.write(captures[1] + " occurs in both strings");
}
else
{
document.write("no match in both strings");
}
function isMatching(a, b)
{
return new RegExp("\\b(" + a.match(/\w+/g).join('|') + ")\\b", "gi").test(b);
}
isMatching("in", "pin"); // false
isMatching("Everything is beautiful, in its own way", "Every little thing she does is magic"); // true
isMatching("Hello World", "world is beautiful"); // true