2009-03-24 2 views
13

패턴과 일치하거나 비어있는 정규 표현식이 필요합니다.패턴과 일치하거나 비어있는 정규 표현식은 무엇입니까?

는 지금은 미국 전화 번호와 일치하는 표현 ...

"\(?\d{3}\)?[-\s.]?\d{3}[-\s.]\d{4}/x" 

을 ...있다. 그러나 테스트중인 문자열이 비어있는 것은 유효합니다. 문자열에 값이 전혀 없으면 표현식과 일치해야합니다.

동일한 조건이 필요한 미국 우편 번호와 일치하는 다른 패턴이 있습니다.

같은 표현에서 이것을 달성하는 가장 좋은 방법은 무엇입니까?

설명 : Microsoft의 유효성 검사 응용 프로그램 블록에서 RegexValidator를 사용하고 있습니다. 이를 사용하는 예는 다음과 같습니다.

[StringLengthValidator(0, 100, MessageTemplate = "Email must be between {3} and {5}")] 
[RegexValidator(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", MessageTemplate = "Valid Email Required.")] 
public string EmailAddress 
{ 
    get { return _EmailAddress; } 
    set { SetValue<string>(ref _EmailAddress, value); } 
} 

이 때문에 솔루션을 하나의 표현식으로 사용해야합니다.

+0

정규식 끝에/x는 무엇입니까? Perl이나 PHP에서는 자유 공간 모드를 의미하지만 .NET에서는 해당 구문을 사용하지 않습니다. –

+0

아 .. 실제로 몰라. 방금 사이트에서 어딘가로 옮겼습니다. 나는 그것을 제거하고 도움이되는지 확인합니다. –

답변

29

전체 정규식을 괄호로 묶고? 끝에 :

(\(?\d{3}\)?[-\s.]?\d{3}[-\s.]\d{4}/x)? 
+0

은 매력처럼 작동했습니다. 나는 그것이 이렇게 단순 할 것임을 알았다. :) –

+2

실제로 ... 이것은 올바르게 작동하지 않습니다. 후행 물음표는 정규식을 너무 용서하게 만듭니다. 예를 들어, 555-1234가 이제는 일치하지만 그렇지 않아야합니다. –

+0

원래 정규식이 작동한다고 가정하면 \ B | \\ (? \ d {3} \\)? [- \ s.]? \ d {3} [- \ s.] \ d {4 }/x "빈 문자열"또는 정규식 –

1

(?:<your_regex>)?으로 정규식을 래핑 해보세요.

1

이 시도 :

@"^(?:(\()?\d{3}(?(1)\)|[-\s.])\d{3}[-\s.]\d{4})?$" 

(?(1)\)|[-\s.]) 부분은 조건부 구조입니다. "처음에 ('#'(그룹 1이 무언가와 일치했기 때문에 우리가 알고있는) ')'이 있으면 여기에 ')'를 매치하고 그렇지 않으면 하이픈, 공백 또는 점과 일치시킵니다." (?:...)?에 전체를 래핑하면 케빈이 말한 것처럼 빈 문자열과 일치시킬 수 있습니다. 그것이 당신을 위해 작동하지 않는다면, 괄호 중 하나 (또는 ​​백 슬래시 중 하나)를 잘못 배치 했어야합니다.

테스트 목적으로 ^$ 앵커를 추가했습니다. 유효성 검사기 컨트롤에서 필요하지 않아야합니다.

+0

흥미롭게도, 당신의 정규 표현식은 내가 사용해온 표현 체크 사이트와 완전히 충돌한다 (http://www.nvcc.edu/home/drodgers/ceu/resources/test_regexp.asp).그러나 일반 아이디어가 작동하기 때문에 +1. –

+0

해당 사이트에서 .NET regex 엔진을 사용하는지 알고 있습니까? 여기에서 잘 작동합니다. http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx –