2011-01-14 3 views
0

은 내가정규식 문자열 C#을

string = "STATE changed from [Fixed] to [Closed], CLOSED DATE added [Fri Jan 14 09:32:19 
MST 2011], NOTES changed from [CLOSED[]<br />] to [TEST CLOSED <br />]" 

내가 NOTES changed from [CLOSED[]<br />] to [TEST CLOSED <br />]을 잡고 두 개의 문자열 변수의 값 CLOSED[]TEST CLOSED를 취할 필요가 정규식 표현

을 파악하는 도움이 필요합니다. "변경 NOTES는"처음에 시작하는 경우에만 일치하고 더 '[]'에서 '[]',하지만 난이 "[CLOSED []]가없는

Regex NotesChanged = new Regex(@"NOTES changed from \[(\w*|\W*)\] to \[([\w-|\W-]*)\]"); 

:
지금까지 내가 도착 또한 "
"도 없습니다. 정규식에서 무엇을 변경해야하는지에 대한 아이디어.

감사합니다, 브래킷 그룹의 샤르마

+0

매번 "
"이 표시 될 예정입니까? –

+0

네, 그 표현은 "
"과 작동하지 않습니다. 어떻게 그런 말을 할 수 없습니까? – remo

답변

1

언제든지 "< br/>"이 표시되면 내가 가장 좋아하는 패턴 중 하나를 사용할 수 있습니다 (기억할 가치가 있습니다). 패턴은 다음과 같습니다

delim[^delim]*delim 

패턴 위에 다시 수, 다음 구분 기호로 구분 기호를 제외하고 많은 시간을 아무것도 다음에 구분 기호를 일치합니다. 영어

NOTES changed from \[([^<]*)[^\]]*\] to \[([^<]*)[^\]]*\] 

:

  • 가 개방 그랩 [
  • 캡처 # 1 모든 문자 <까지합니다 (가정 여기

    내가 사용하는 유혹 될 정규 표현식이다 br 태그는 항상 거기에 있습니다)
  • 닫을 때까지 읽음]
  • s

    NOTES changed from (?:(?:\[)?([A-Z]+\[\]))<br />\] to \[([A-Z]+\s+[A-Z]+) 
    

    위의 문자열 NOTES changed from [CLOSED[]<br />] to [TEST CLOSED을 일치합니다 2에 CLOSED[]TEST CLOSED을 넣어 : 특정 키워드 나 문구로 정규식을 고정의 고급 스러움이있는 경우 econd 캡처 영역

+0

저는 delim의 아이디어를 좋아했습니다. 고맙습니다. 그것은 나를 위해 위대한 작품. – remo

+0

나를 좋은 정규 표현식 튜토리얼로 안내 할 수 있습니까? 여기서 우리는 언급 된 패턴을 가지고 있습니다. – remo

+0

@sharma, 솔직히 말해서 나는 www.regular-expressions.info 이외의 좋은 자원을 모른다. 그러나 그 웹 사이트는 패턴보다는 구문에 초점을 맞추고있다. 구분 기호 패턴은 경험에서 나온 것입니다. –

0

를 추가해보십시오 "\[|\]"캡처에 순서.

Regex NotesChanged = new Regex(@"NOTES changed from \[(\w*|\W*|\[|\])\] to \[([\w-|\W-|\[|\]]*)\]"); 
1

이 이상한의 종류 ...

(\w*|\W*) 

모든 단어 문자 제로 또는 여러 번 또는 모든 비 단어 문자 제로 또는 여러 번

의 캡처 그룹 무엇 싶어 구분 기호를 사용하지 않는 패턴을 작성하는 것입니다. 매칭 된 텍스트가 매치에서 첫 번째 그룹이고 [with some text in it] 중 발생 일치

\[([^\]]+)\] 

.

문자열 자체에 중첩 된 동일한 유형의 구분 기호가 있기 때문에 조금 더 교묘 해지고 "룩어 - 헤드"또는 일종의 변경을 사용해야합니다.

((?:[^\[\]]|\[\])*) 

이 개선 된 미래가 될 수 있지만 [[[]]]이있는 경우 해결할 수없는 여기에 문제가있다. 재귀 일반 표현식을 만들 수 없습니다. 유연하지 않습니다. 따라서 최대 깊이를 하드 코딩하거나 정규 표현식을 여러 번 적용해야합니다.

이 일을 매우 철저한 방법은 당신이 중첩 된 괄호에 맞게 balancing group definitions를 사용할 수 있다고 생각

\[((?:[^\[\]]*)(?:(?=\[)(?:[^\]]*)\])?([^\]]))\] 
+0

감사합니다. CLOSED []와 [CLOSED]를 캡처 할 수 없었습니다. 그것과 일치시킬 수있었습니다. 하지만 정규 표현식에 대해 알아두면 좋았을뿐입니다. 다시 한 번 감사드립니다. 지금 솔루션을 가지고 있습니다. – remo

+0

그러면 솔루션에 기여한 사람들에게 투표하십시오. 또한 마지막 예제를 자세히 살펴보아야합니다. 정규 표현식이므로 완전히 쳐져 보입니다.하지만 바깥 쪽 괄호와 일치하고 중첩의 한 수준을 처리합니다. '
' 태그가 있다고 가정하고, 공식적인 문법이없는 것 같아서별로 중요하지 않습니다. 그러나 나는 이것이 당신이 이것을 생각할 것을 촉구합니다. 그 접근법에는 구멍이 있습니다. –

0

이 될 것입니다. 나는 이것이 적어도 특정 구현의 맛에서 .NET에 특화되어 있다고 생각한다.

class Program { 
    static void Main (string[] args) { 
     var input = "STATE changed from [Fixed] to [Closed], CLOSED DATE added [Fri Jan 14 09:32:19 MST 2011], NOTES changed from [CLOSED[]] to [TEST CLOSED ]"; 
     var regex = new Regex(@"NOTES changed from (((?'open'\[)[^\[\]]*)+((?'close-open'\])[^\[\]]*)+)*"); 

     foreach (var match in regex.Matches(input)) { 
      Console.WriteLine(match); 
     } 
    } 
} 

이 나를 위해 NOTES changed from [CLOSED[]] to [TEST CLOSED ]을 인쇄 : 여기 당신의 입력에 적응 한 해당 페이지에 예제가있다. 나의 적응에서, 대괄호가 적절히 균형 잡혀 있지 않다면, 나의 예제를 당신의 요청을 만족시킬 가장 작은 최소값으로 줄이기 위해, 일치하지 않는 표현식을 생략했다. 표현식은 다음과 같다. 이미 꽤 불쾌하게 복잡한.

편집 : 내가 게시하는 동안 귀하의 질문이 약간 편집 된 것을 보았습니다. 여기서 제공 한 정규 표현식의 일부는 추출해야하는 부분 문자열의 캡처 그룹으로 바꿀 수 있어야합니다.

+0

아이디어를 제공해 주셔서 감사합니다. 폐장 된 []을 (를) 캡처하여 닫을 수 없었습니다. 하지만 정규 표현식에 대해 알아두면 좋았을뿐입니다. 다시 한 번 감사드립니다. 지금 해결책이 있습니다 – remo

0

는 다음 작동 것 별도의 그룹.

업데이트이도 짧은 (그리고 조금 더 비 특정)을 . 지정자 사용하여 만들 수 있습니다 사실

:

NOTES changed from (?:(?:\[)?([A-Z]+\[\])).+\[([A-Z]+\s+[A-Z]+) 

이는 위처럼 일치하는 의미를, 그 사이에있는 <br /> 태그 등을 일치시키는 것에 대한 구체적인 정보 만 제공되는 대신 중간에 관계없이 일치하게됩니다.

관련 문제