2012-10-12 98 views
2

我想检查一个字符串中是否有两个或多个值,而不管它们在所述字符串中的位置。例如,如果我想的条件“或”正则表达式,我会这么做:查找字符串中的多个子字符串

/(a|b)/.test("a") // true 

但我需要的是一个“与”;是这样的:

/(a&b)/.test("a") // false 
/(a&b)/.test("b") // false 
/(a&b)/.test("a b") // true 
/(b&a)/.test("a b") // true 
/(a&b&c)/.test("a b") // false 
/(a&b&c)/.test("a c b") // true 

显然,这句法是不正确的......

这些值abc等都是从一个阵列拉动。我试过使用eval()indexOf(a) !== -1 && indexOf(b) !== -1的组合,但这太慢了,这就是我转向正则表达式的原因。

+0

讨论转移到[chat](http://chat.stackoverflow.com/rooms/17952/discussion-between-guilherme-nascimento-and-nulluserexception) – NullUserException

回答

1

既然你匹配固定的字符串,你可以只使用:

function matchAll(str, arr) 
{ 
    for (var i=0; i<arr.length; ++i) { 
    if (str.indexOf(arr[i]) === -1) { 
     return false; 
    } 
    } 
    return true; 
} 

matchAll('a', ['a']); // true 
matchAll('a', ['a', 'b']); // false 
matchAll('a b', ['a', 'b']); // true 
matchAll('a b c', ['a', 'b']); // true 
matchAll('a b', ['a', 'b', 'c']); // false 
matchAll('a c b', ['a', 'b', 'c']); // true 
matchAll('c a b', ['a', 'b', 'c']); // true 

如果您正在寻找固定的字符串,.indexOf()会比正则表达式更快。

+0

@Guilherme见:http://chat.stackoverflow.com/transcript/message/5756258#5756258 – NullUserException

2

你可以做这样的:贴会做什么你问的

/(?=.*a)(?=.*b)/.test("a") 
+1

对于那些想知道这是什么:[Lookahead](http: //www.regular-expressions.info/lookaround.html)(零宽度断言) – NullUserException

+0

你不喜欢符号“?” 。谢谢 –

1

答案@OmarJackman。不过,值得注意的是他的解决方案使用了比简单的正则表达式需要更多处理的lookaround。如果你正在寻找良好的性能,我建议你只运行两个单独的正则表达式(测试案例a,然后案例b)。两个简单的正则表达式比一个复杂的正则表达式快几个数量级,特别是当搜索文本变大时。

编辑:正如在评论中指出的那样,“数量级”是对性能影响的不公平夸大,但不论性能如何,都应予以考虑。

+0

我不相信lookaround会使“正常”的正则表达式变慢。 – NullUserException

+0

太担心表演,如果你有任何没有“?”的例子感恩。谢谢 –

+0

@NullUserException你可能是对的,“数量级”几乎肯定是夸张的,但无论性能点值得注意(尤其是当像CaffGeek这样简单的解决方案在更高性能时可读性更好) – ean5533

相关问题