2011-02-04 5 views
4

사용자 명을 검증하기 위해이 코드를 작성했습니다. 주어진 조건을 충족 시키려면이 코드를 작성했는데, 어떻게하면 2 개의 RegEx를 하나의 코드로 변환 할 수 있습니까? 코드는 C#을에게 있습니다사용자 명을 확인하기 위해 하나의 RegEx를 생성하십시오.

/// <summary> 
    /// Determines whether the username meets conditions. 
    /// Username conditions: 
    /// Must be 1 to 24 character in length 
    /// Must start with letter a-zA-Z 
    /// May contain letters, numbers or '.','-' or '_' 
    /// Must not end in '.','-','._' or '-_' 
    /// </summary> 
    /// <param name="userName">proposed username</param> 
    /// <returns>True if the username is valid</returns> 
    private static Regex sUserNameAllowedRegEx = new Regex(@"^[a-zA-Z]{1}[a-zA-Z0-9\._\-]{0,23}[^.-]$", RegexOptions.Compiled); 
    private static Regex sUserNameIllegalEndingRegEx = new Regex(@"(\.|\-|\._|\-_)$", RegexOptions.Compiled); 
    public static bool IsUserNameAllowed(string userName) 
    { 
     if (string.IsNullOrEmpty(userName) 
      || !sUserNameAllowedRegEx.IsMatch(userName) 
      || sUserNameIllegalEndingRegEx.IsMatch(userName) 
      || ProfanityFilter.IsOffensive(userName)) 
     { 
      return false; 
     } 
     return true; 
    } 
+2

두 개의 반투명 정규 표현식을 하나의 읽기 어려운 정규 표현식으로 바꾸는 이유는 무엇입니까? 코드가 현재 올바르게 작동하지 않습니까? 하나의 정규 표현식만을 사용하는 동기는 무엇입니까? – CanSpice

+0

바로 내 현재 정규식은 마지막 문자로 잘못된 문자를 허용합니다. 예를 들면 : aab $ 또는 aab #는 내 정규식에서 허용됩니다. 왜냐하면 last 절은 그렇지 않은 문자를 사용하기 때문입니다. 또는 - 은 [a-zA-Z0-9 \ _] $이어야합니다. 그래서 나는 그 코멘트를 위해 thx를 고칠 필요가있다. – Nathan

+0

방금 ​​어떻게 할 수 있는지보고 싶었습니다. – Nathan

답변

6

귀하의 요구 사항을 올바르게 이해하면 아래 내용이 귀하가 원하는 내용이어야합니다. \w은 글자, 숫자 또는 _과 일치합니다. 선행 문자가 . 또는 - 아닌 한

negative lookbehind합니다 ((?<![-.]) 부분) _ 있습니다.

@"^(?=[a-zA-Z])[-\w.]{0,23}([a-zA-Z\d]|(?<![-.])_)$" 
+0

@Nathan Wilfert : 여기서 중요한 부분은 부정적인 생각이라고 강조해야합니다. 그게 네가 쥐고있는 것 같아. –

+0

이 답변은 닫는 것처럼 보이지만 'a'와 같은 하나의 charater 문자열을 허용하지 않습니다. – Nathan

+0

@Nathan : 흥미로운 점입니다. 정규 표현식으로 모든 가능성을 설명하기는 때로는 어렵습니다. {a-zA-Z} ({a-zA-Z}) [0,23] ([a-zA-Z \ d] |?

1

봅니다 마지막 문자 클래스에 욕심 +를 추가하고 비 욕심 중산층합니다,

@"^[a-zA-Z][a-zA-Z0-9\._\-]{0,22}?[a-zA-Z0-9]{0,2}$" 

이, .의 조합에 - 끝나는 것을 허용하지 않습니다 또는 _. 이것은 당신이 원래 정규식에서 가지고있는 것과 정확히 똑같지는 않지만 아마도 그것이 당신이하려고하는 것이라고 생각합니다.

+0

이것은 24자를 초과하는 사용자 이름을 전달합니다. – eyelidlessness

+0

동의 함, 편집 내역보기 – kelloti

+0

허용되지 않는 문자/조합으로 끝나는 문자열도 허용합니다 (테스트 한 결과). 편집 : 그리고 당신의 마지막 문자 클래스가 시행 가능하다면 (그렇지 않은 경우), 그것은 명세 당 허용 된 문자를 허용하지 않을 것입니다. – eyelidlessness

1
^[a-zA-Z][a-zA-Z0-9._-]{0,21}([-.][^_]|[^-.]{2})$ 

정말 가까워지고 있습니다 (단 하나가 아닌 3 자 이상을 제외하고는 모든 요구 사항을 충족합니다). 아래로 내려가는 것은 C#의 정규식 기능에 대한 내 연구에 대한 약간의 연구가 필요할 것이며, 지금은 시간이 없지만 올바른 방향으로 갈 수 있기를 바랍니다.

+0

이것은 작동하지 않습니다. 결말이 너무 넓습니다. "foo."와 "foo x"와 일치합니다. –

1

친구, 문자열의 끝에 확인할 수있는 표현식은 네 개뿐입니다. 맞습니까? 그래서 첫 번째 정규식을 사용하여 사용자 이름을 확인한 다음 문자열 함수를 사용하여 네 개의 결말을 확인하십시오. 그것은 이상한 정규식보다 훨씬 더 많은 시간을 소비하지 않습니다.

string.EndsWith() 메소드를 사용하여 '.', '-', '를 확인하십시오. '또는'- '

+0

이것이 제가 끝내게 될 것입니다. 저는 방금 한 정규식으로 이것을하는 방법을 찾는 것이 재미있는 문제라고 생각했습니다. – Nathan

관련 문제