2016-09-02 2 views
5

날짜 형식을 쉼표로 일치시키는 정규식이 있습니다.Regex 옵션 "Multiline"

YYYY/MM/DD 또는 YYYY/mm

:

2016/09/02,2016/08,2016/09/30

내 코드 :

string data="21535300/11/11\n"; 
Regex reg = new Regex(@"^(20\d{2}/(0[1-9]|1[012])(/(0[1-9]|[12]\d|30|31))?,?)*$", 
         RegexOptions.Multiline); 

if (!reg.IsMatch(data)) 
    "Error".Dump(); 
else 
    "True".Dump(); 

옵션 multiline을 사용합니다. 문자열 데이터에 "\ n"이있는 경우. 모든 문자가이 정규식과 일치합니다. 예를 들어

:

string data="test\n" 
string data="2100/1/1" 

I find option definition in MSDN. 그것은 :

입력 문자열의 시작과 끝 대신 줄의 시작과 끝이 일치하도록^및 $ language 요소의 해석을 변경합니다.

이 문제가 발생한 이유를 알지 못했습니다. 누구나 이해할 수 있습니까? 감사합니다. .

+1

아마도 정규 표현식이 그룹이기 때문에 – Kelvin

+0

예, 정규식은 빈 * 줄 *과 일치합니다. –

+0

감사합니다. 당신의 설명을 듣고 곧 이해합니다. –

답변

2

정규식은 문자열의 끝에 개행을 추가하면 얻을 수있는 빈 줄과 일치 할 수 있습니다. "test\n"에는 2 줄이 포함되어 있고 두 번째 줄은 일치합니다.

은 자유 공간 모드에서 정규식 패턴을 참조하십시오

^     # Matches the start of a line 
(    # Start of Group 1 
    20\d{2}/ 
    (0[1-9]|1[012]) 
    (/ 
    (0[1-9]|[12]\d|30|31) 
    )?,? 
)*    # End of group 1 - * quantifier makes it match 0+ times 
$     # End of line 

것은 당신이, 빈 라인을 일치 )+와 마지막 )*을 대체하지 않으려면.

대안은 regex demo를 참조

^20\d{2}/(0[1-9]|1[012])(/(0[1-9]|[12]\d|3[01]))?(,20\d{2}/(0[1-9]|1[012])(/(0[1-9]|[12]\d|3[01]))?)*$ 

같은 더 전개 된 패턴을 사용하는 것입니다. 여기 의무입니다 (행 ^ 앵커의 시작 후) 첫 번째 블록을 참조하고, 따라서 수 있듯이

string date = @"20\d{2}/(0[1-9]|1[012])(/(0[1-9]|[12]\d|3[01]))?"; 
Regex reg = new Regex(string.Format("^{0}(,{0})*$", date), RegexOptions.Multiline); 

을 : 코드 내부, 블록을 사용하여 동적 패턴을 구축하는 것이 좋습니다 빈 줄은 결코 일치하지 않을 것입니다.