2011-04-09 7 views
5

광범위 : a) 처음, b) 전체 단어 및 c) 끝에 대한 정규식 규칙과 단어를 어떻게 일치 시킵니까?.NET 정규식 일치

은 구체적으로 :

  1. 그것은 중 하나를 가질 수 없습니다 : 어떻게 다음과 같은 규칙이 길이> = 1의 표현과 일치 않습니다! @ #
  2. 그것은 공백으로 시작하거나 할 수없는 =
  3. 그것은 내가 노력 공간

끝날 수 없습니다 :

^[^\s=][^[email protected]#]*[^\s]$ 

그러나 단어의 첫 번째 문자지나 ^[^\s=] 일치 이동 . 따라서 이것은 또한 '!'로 시작하는 단어와 일치합니다. 또는 '@'또는 '#'(예 : '#ab'또는 '@aa'). 또한 단어가 최소 2 자 (끝 문자 하나가 공백 또는 = 및 하나의 공백이 아닌 시작 문자)가되도록합니다. 처음 두 규칙과 일치하는 정규 표현식에 대한

^[^\s=([email protected]#)]\1*$ 

:

나는에 도착. 그러나 길이가 1 인 단어를 허용하는 단어 뒤에 공백이 어떻게 일치합니까?

+2

+1 첫 번째 정규식 질문을 갖기 때문에 이전에 실패한 시도가 몇 주 동안 보였습니다. 다시 말해, * real * regex 질문 인 +1. –

답변

3

첫 번째 시도는 매우 가까웠습니다. 당신은 첫 번째와 마지막 부분에 더 많은 문자를 제외해야하고, 마지막 두 부분은 선택합니다

^[^\[email protected]#](?:[^[email protected]#]*[^\[email protected]#])?$ 

이 세 가지 섹션 [email protected]#의 포함되지 않습니다 보장합니다. 그런 다음 의 단어가 인 경우 단어의 길이가 한 문자를 초과하면 비어있는 문자로 끝나야하며 그 사이에 공백을 채우는 문자 만 선택해야합니다. 이것은 ^$ 앵커로 인해 모두 올바르게 적용됩니다.

()은 캡처 그룹이 아닌 문자 클래스 내에 포함 된 경우 ()을 리터럴 문자로 사용해야하므로 두 번째 예제와 일치하는지 잘 모르겠습니다.

4

카메론의 솔루션은 정확하고 효율적입니다 (속도를 최적화해야하는 모든 생산 코드에 사용해야합니다). 여기에 제시된 대답은 덜 효율적이지만 정규식을 사용하여 논리를 적용하는 일반적인 방법을 보여줍니다.

대상 문자열의 한 위치 (일반적으로 시작 부분)에 여러 긍정적 및 부정적 미리보기 정규 표현을 사용하여 일치에 대해 여러 논리 제약 조건을 적용 할 수 있습니다. 아래 주석 처리 된 정규 표현식은이 예제의 경우에 이것이 얼마나 쉬운지를 보여줍니다. 정규 표현식 엔진이 실제로 어떻게 일치하는지 (그리고 일치하지 않는지), 올바른 표현식을 생각해 낼 수 있어야하지만 이해가되면 어렵지 않게 이해해야합니다.

foundMatch = Regex.IsMatch(subjectString, @" 
    # Match 'word' meeting multiple logical constraints. 
    ^   # Anchor to start of string. 
    (?=[^[email protected]#]*$) # It cannot have any of: ! @ #,  AND 
    (?![ =])  # It cannot begin with a space or =, AND 
    (?!.*\S$)  # It cannot end with a space,  AND 
    .{1,}   # length >= 1 (ok to match special 'word') 
    \z   # Anchor to end of string. 
    ", 
    RegexOptions.IgnorePatternWhitespace); 

"정규식 논리"의이 응용 프로그램

자주 복잡한 암호 유효성 검사에 사용됩니다.