2012-10-12 7 views
2

문자열 안에 두 개 이상의 값이 있는지, 문자열 내에서의 위치에 관계없이 확인하고 싶습니다.문자열에 여러 부분 문자열 찾기

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

을하지만 제가 필요한 것은이다 "AND", 예를 들어 내가 의 조건을 원한다 "OR"정규식에서 경우, 나는 그렇게 할 것이다 이 같은 :

/(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 

은 분명히이 구문이 올바르지 않습니다 ...

이 값 a는 등 b, c이 배열에서 가져온 있습니다. eval()indexOf(a) !== -1 && indexOf(b) !== -1의 조합을 사용해 보았습니다.하지만 너무 느려서 regexes를 사용하게되었습니다.

+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를 사용한다는 점은 주목할 가치가 있습니다. 좋은 성능을 찾고 있다면 두 개의 별도 regexes (case a을 테스트 한 다음 b)를 실행하는 것이 좋습니다. 두 개의 간단한 정규 표현식은 복잡한 텍스트보다 훨씬 빠른 속도로 실행됩니다. 특히 검색 텍스트가 커지면 커집니다.

편집 : 의견에서 언급했듯이 "규모의 주문"은 불리한 성능 영향의 과장이지만 성능은 고려하지 않아야합니다.

+0

저는 lookaround가 정규 표현식 "orders of magnitude"를 느리게 만들 것이라고 확신하지 않습니다. – NullUserException

+0

"예"가없는 경우 예, 성능에 대해 너무 걱정하지 않습니다. 고마워. 감사합니다 –

+0

@NullUserException 당신이 맞을 것입니다. "주문의 크기"는 거의 틀림없이 과장되어 있지만, 성능에 관계없이 주목할 가치가 있습니다 (특히 CaffGeek와 같은 간단한 솔루션이 더 좋은 성능을 내면서 읽기 쉽습니다). – ean5533

관련 문제