2012-05-31 5 views

답변

10

이 전체 문자열과 일치하는 정규식 내다 솔루션입니다 그것은 단지 참조를 위해 임의의 순서로 필요한 부품이 포함 된 경우. 당신이 구성 변수의 어떤 종류의 패턴을 저장하지 않으면, 그래도 nhahtdh의 솔루션을 다루고 싶어요.

/^(?=.*OU=Karen)(?=.*OU=admin).*$/ 

^  - line start 
(?=  - start zero-width positive lookahead 
.*  - anything or nothing 
OU=Karen - literal 
)  - end zero-width positive lookahead 
     - place as many positive or negative look-aheads as required 
.*  - the whole line 
$  - line end 
+0

설명 주셔서 감사합니다! – ahmd0

1

정확한 문자열을 검사하기위한 조건의 수만큼 또는 indexOf() 수만큼 지정할 수 있습니다. 정규식이 필요 없습니다.

확장 가능한 정규 표현식 (더 많은 조건을 지원할 수 있음)은 앞을 봐도 가능하지만 더 잘 수행 될지는 의문입니다. 당신이 같은 문자열에 대한 조치를 여러 번 이러한 유형의를 수행 할, 많은 토큰이 문자열이있는 경우

는, 당신은 몇 가지 데이터 구조에 문자열 저장을 구문 분석 고려할 수 있습니다.

+0

이럴하지 대답을 질문에 하지만 당신 말이 맞아요. – rekire

+0

때로는 "어떻게해야합니까?"라는 질문에 대한 최선의 대답은 "X를 수행하지 말고 Y를 수행하십시오"입니다. RE는 환상적인 도구이지만 체인 톱도 마찬가지입니다 - 그래도 손톱을 부딪 치는 데 사용하지 않을 것입니다. -) – paxdiablo

+0

프로그래밍 언어를 사용할 수 없습니다. 그것은 정규 표현식이어야합니다. 죄송합니다. – ahmd0

0

아니, 아니 당신이 vi을 사용하지 않는 : 그것은 \&하지만 운영자

/(OU=Karen.*OU=admin|ou=admin.*OU=Karen)/ 

이 충분히 가까이 될 수도, 또는 유사한 있습니다. 당신이 정규식을 사용해야하는 경우

3

, 당신은 당신이 하나의 정규식 모든, 또는 하나 정규식을 할 필요가 없습니다 실현

/OU=Karen.*?OU=admin|OU=admin.*?OU=Karen/ 
+0

+ +1 욕심이없는 정규식 – rekire

6

를 사용할 수 있습니다.

정규식은 입력 클래스를 잡는 데는 매우 적합하지만 두 개의 고정 문자열이있는 경우 두 가지 모두에 형식 방법을 사용하고 결과를 and 만 사용할 수 있습니다.

또는 정규 표현식을 사용해야하는 경우 두 번 (문자열 당 한 번) 사용하고 and 개의 결과를 함께 사용할 수 있습니다. 당신이 하나의 정규식으로 할 필요가있는 경우

, 당신은 같은 것을 시도 할 수 :

,OU=Karen,.*,OU=admin,|,OU=admin,.*,OU=Karen, 

을하지만 당신은 또한 그 연은 시작 또는 끝에서 나타날 때 걱정해야합니다 선 및 모든 종류의 다른 가장자리 경우 (시작 또는 끝에 하나 또는 둘 모두, 서로 옆에, Karen7 또는 administrator-lesser과 같은 이름 등).

아마 같은 괴물 뭔가 끝날 것 모든 가능성을 허용하는 데 :

^OU=Karen(,[^,]*)*,OU=admin,| 
^OU=Karen(,[^,]*)*,OU=admin$| 
,OU=Karen(,[^,]*)*,OU=admin,| 
,OU=Karen(,[^,]*)*,OU=admin$| 
^OU=admin(,[^,]*)*,OU=Karen,| 
^OU=admin(,[^,]*)*,OU=Karen$| 
,OU=admin(,[^,]*)*,OU=Karen,| 
,OU=admin(,[^,]*)*,OU=Karen$ 

,하지만 고급 enouge 정규식 엔진이 작은 뭔가를 환원 될 수있다하는 것은 (비록에게 그 가능성이 될 것입니다 모든 전방보고/뒤로 추적으로 인해 더 빨라질 수 있습니다. 복잡한 정규식없이 개선 될 수 있다는

한 가지 방법은 문자열을 마사지하는 것입니다 조금 전에 손 그래서 경계 검사가 필요하지 않습니다 : 그것은 시작하고 쉼표로 끝나도록

newString = "," + origString.replace (",", ",,") + "," 

그리고 내의 모든 쉼표가 중복됩니다

,321 : 다음

,OU=Karen,,OU=Office,,OU=admin,,DC=corp,,DC=Fabrikam,,DC=COM, 

당신이 훨씬 간단 확인 만하면됩니다 0

이 언급 한 모든 잠재적 인 문제를 제거합니다

  • 중 하나 문자열의 시작에.
  • 문자열 끝에.
  • 이 서로 인접한다.
  • Karen2과 같은 확장 이름이 실수로 일치합니다. 모두를 무시

    str = "OU=Karen,OU=Office,OU=admin,DC=corp,DC=Fabrikam,DC=COM" 
    elems[] = str.splitOn(",") 
    
    gotKaren = false 
    gotAdmin = false 
    for each elem in elems: 
        if elem = "OU=Karen": gotKaren = true 
        if elem = "OU=admin": gotAdmin = true 
    
    if gotKaren and gotAdmin: 
        weaveYourMagicHere() 
    

    이를 : 아마


(언어가 허용하는 경우)이 작업을 수행 할 수있는 가장 방법은 단순히 무언가 같이 쉼표에 문자열을 분할하고이를 검토하는 것입니다 순서가 나타날 수 있으며 엣지 경우를 감지하는 데 필요한 정규식 "체조"를 우회 할 수 있습니다.

은 또한 아마 당신은 (OU \ = 카렌 같은 것을 사용할 수 있습니다

+0

+1, 다시 말했듯이, 설명 주셔서 감사하지만 이것은 정규 표현식이어야합니다. – ahmd0

+0

@ ahmd0, 그러면 내가 경고 한 모든 가능성을 설명하면서 내가 준 정규식을 살펴볼 수 있습니다. 또는 정규 표현식 엔진이 충분히 발전 되었다면, Eugene의 솔루션이 아마도 최고 일 것입니다. – paxdiablo

+0

+1. 분할 및 체크를 잊어 버렸습니다 (본인은 내 게시물에서 반복적으로 점검 할 때만 이것을 고려합니다). 확실하지는 않지만 성능이 이렇게 좋을 수 있습니다. – nhahtdh

-1

:-)에 해당하는 정규식보다 더 많은 읽을 수 있다는 장점이있다

+1

안녕하세요, 스택 오버플로를 환영합니다. 이것은 질문에 잘 대답 할 수 있습니다. 그러나 약간의 설명은 항상 좋은 아이디어입니다. S/O에 관한 초보자에게는 당신에게서 두세 가지를 배울 수있는 힙이 있습니다. 그리고 당신에게 분명 할 수있는 것은 그들에게는 없을 것입니다. –

관련 문제