
Say I have some strings,
var string1 = "hey this is jack and michael"; var string2 = "hey this is jack and jenny"; And I have an array of strings:
var arr = ['jack', jenny']; How do you write a function so that:
fn(string2, arr); // true fn(string1, arr); // false Kind of like String.indexOf() or regex with a|b|c, but no individually.
渣渣...
function containsAll(haystack, needles){ for (var i = 0; i < needles.length; i++){ if (haystack.indexOf(needles[i]) === -1) return false; } return true; } 1 ershisi 2016 年 4 月 25 日 虽然不知道为什么要用英文。你的数组缺少一个闭合。 另外最简单的办法,如果你的字符串都是以空格分隔的。那就把第一个 string 参数分割成数组。然后再去判断。用不着正则的感觉。。。 |
2 Magic347 2016 年 4 月 25 日 python 版: def fn(str, arr): ____return all(x in str for x in arr) |
4 spance 2016 年 4 月 25 日 这个其实就是多模式匹配,比较好的方法是使用 W-M 或者 A-C 算法可以做到 O(m+n),或者没啥要求或者数量较小就像最后那个 for 里面逐个查找也可以。 |
5 jyyyxy 2016 年 4 月 25 日 java 版 BiPredicate<String, List<String>> fun = (str, arr) -> arr.stream().allMatch(str::contains); |
6 xjp 2016 年 4 月 25 日 arr.every((s) => string1.contains(s)); |
7 murmur 2016 年 4 月 25 日 AC 自动机 应该有 java 版的 |
8 zhujinliang 2016 年 4 月 25 日 Javascript: function containsAll(haystack, needles) { return !!haystack.match(new RegExp('('+needles.join('|')+')')); } |
9 pollow 2016 年 4 月 25 日 我还以为进来能看到有人讨论 AC 自动机,没想到一群写循环的…… |
10 7jmS8834H50s975y 2016 年 4 月 25 日 VIML let s:str1 = "hey this is jack and michael" let s:str2 = "hey this is jack and jenny" let s:list = ['jack', 'jenny'] fu! s:checkstr(str,list) if 0 < index(split(a:str,' '),a:list[0]) && index(split(a:str,' '),a:list[0]) < index(split(a:str,' '),a:list[1]) return "true" else return "false" endif endf echom s:checkstr(s:str1,s:list) echom s:checkstr(s:str2,s:list) |