2013-02-12 3 views
1

아주 간단한 정규 표현식을 찾으려고하는데 재구성 할 수 없는데 왜 작동하지 않는 겁니까? 여기 정규식, 초보자 용 예제

내가 일치 할 표현이다 D : 내가 정규식 물건으로 해요,하지만 불행히도 그렇게하지 않는 것 생각이으로

interval=4|termination=2012-09-18 22:00:00|days=3

를, 내가 갖고 싶어 아무렇지도 않게 보이는 배열이 일치합니다.

match = array({"interval" => "4", "termination" => "2012-09-18 22:00:00", "days" = "3"}); 
//(pseudocode) 

저는 C#에서 패턴 이름을 사용하고 싶습니다. 이 패턴으로 시도해 보았습니다.

(.*)((termination=(?<termination>(.{19})))|(interval=(?<interval>(\d*)))|(days=(?<days>(\d*))))*(.*) 

어디에서 실패했는지 아무도 지적 할 수 있습니까? 난 당신이 PHP 배경에서 오는 생각

+0

정규식 어디 (공백과 줄 바꿈은 가독성을 위해 추가)? –

+1

정규식 도구를 사용하여 테스트 해 보셨습니까?많은 도구가 도움이 될 수있는 결과 일치 (또는 일치하지 않는 항목)를 분해합니다. 나는 무료 RAD Regex Designer (http://www.radsoftware.com.au/regexdesigner/)를 사용하지만 다른 것들도있다. –

+1

나는 regex101.com –

답변

3

, 당신은 같은 사전에 string.Split와 힘의 출력을 사용할 수 있습니다 사전에

들으 :

string str = "interval=4|termination=2012-09-18 22:00:00|days=3"; 
Dictionary<string,string> dict = str.Split('|') 
            .Select(r => r.Split('=')) 
            .ToDictionary(t => t[0], t=> t[1]); 

및 출력은 다음과 같습니다

enter image description here

+0

그 대답을 주셔서 감사합니다, 확실히이 경우에는 그것을 할 수있는 방법이지만, 나는 더 정교한 사용법을 구축하는 정규식 접근 방식을 찾고 있어요. –

1

|은 regex의 특수 문자로, 대체를 의미합니다. 리터럴 |과 일치하려면 이스케이프 처리해야합니다.

interval=(?<interval>\d*)\|termination=(?<termination>.{19})\|days=(?<days>\d*) 

나는 또한 당신이 필요로하지 않는 것 캡처 그룹을 정리하기 위해 자유를 가지고있다. 또한 Regex.Matches() 메서드와 함께 작동하도록 정규식을 수정했습니다.

입력 순서가 지정된 순서대로 표시된다고 가정합니다.

+1

하지만 순서가 여전히 올바르지 않습니다 – leppie

+0

OP : 정규 표현식에서'|'를 사용할 때 무엇을 시도하고 있는지 잘 모르겠습니다. 입력이 표시된 순서와 같으면 내가 작성한 정규식이 작동합니다. 그렇지 않으면 더 많은 수정이 필요합니다. – nhahtdh

+0

안녕하세요! 그 제안에 감사드립니다. 네, 명령에 무신경 해지고 싶습니다. –

1

결과는 무엇입니까? 나는 (.*)이 탐욕스러워서 전체 문자열을 소비하는 반면, 다른 부분 (접미사는 *)은 제로와 매치 될 것입니다. 따라서 일치는 성공하지만 캡처 그룹은 비어있게됩니다. 그게 당신이 겪고있는거야? , (.*?)

  • 이 필드의 순서를 수정 :

    는 나의 제안은 하비브에 의해 제안 Split로 이동하는 것입니다,하지만 당신은 다음 정규식을 수정하려는 경우 :

    • 은 첫 번째 그룹 non-greedy (lazy) 확인 nhahtdh 또는
    • 필드가 잘못 될 수있는 경우 0, 하나 이상을 허용해야합니다 (정규 표현식에는 적합하지 않지만 수행 할 수있는 작업) :

      으로 제안한대로 |을 이스케이프 처리하십시오.
      (
          (termination=(...)|interval=(...)|days=(...)) 
          (\| (termination=(...)|interval=(...)|days=(...)))* 
      )? 
      

  • +0

    그게 바로 내가 경험 한 것입니다. 빈 배열의 톤, 내 생각에 몇 가지 오류가있는 것 같아요. 내가하고 싶은 또 다른 예는 내 cli 프로그램 (예 : start.exe/help/param1 5/param2 "hello")을 호출 할 때 프로그램 매개 변수를 처리하는 것입니다. –

    +1

    @GiehlMan 정규 표현식을 잘 이해하는 것이 좋지만 , 나는 더 간단한 대안이 제자리에 없을 때만 그것들을 사용하는 경향이있다. 명령 줄 인수를 구문 분석 할 때 AFAIK는 ['OptionSet'] (http://stackoverflow.com/q/491595/520779)을 사용하는 기본 접근 방식을 사용합니다. 그러나 원하는 것이 무엇인지 배우고, 욕설 대 게으른 한정어에 대한 내 의견과 링크를 확인하십시오. 또한 [비 캡처 그룹] (http://stackoverflow.com/q/3512471/520779) (결과를 더 깔끔하게 만드십시오). 전체 문자열 일치를 강제하기 위해'^'와'$ '를 사용하는 것도 도움이됩니다. – mgibsonbr