2012-02-01 3 views
2
는 일부 콘텐츠 내가 일치와 텍스트는이 같은되며 문자열

정규 표현식은

이 여러 번 발생할 수 있습니다 C#

을에 대체 할 텍스트를 가지고있다

어떤 링크 텍스트는/something/something/url.html이 될 수 있습니다. 안으로 그것

나는이 정규 표현식을 사용하고 있지만 바뀌고 있지만 작동하지 않는다. 값에 공백이 없으면 작동하는 것 같습니다.

Regex r = new Regex("!!(?<first>\\S+)::(?<last>\\S+)!!"); 

content = r.Replace(content, delegate(Match match) { return ReturnCustomSpan(match.Groups[1].Value, match.Groups[2].Value); }); 

사람이 도움을 주시겠습니까? 나는 정규식 멍청한 녀석이고 나는 이것을 이해할 수 없다.

+0

무슨 당신이 일치하려는 정확한 패턴? 그 사이에 뭐든지 !! ::가 포함되어 있습니까? – Bort

답변

4

\ S는 모두 공백 문자가 아니므로 공백을 명시 적으로 제외하고 있습니다. . 당신이 사용하는 모든 문자를 일치 시키려면 + 대신 \의 S의 +

2

이 시도 :

!!(?<first>.+?)::(?<last>.+?)!! 

그것은 (.+?)를 비 욕심 한정사를 사용하는 정규식이 제대로 같은 문자열과 일치 있도록 :

This is some content with a !!Some link text here this can be anything::/something/something/url.html!! :: inside it!! 

그렇지 않으면 !!의 첫 번째 발생에서부터 마지막 ​​것까지의 모든 것을 "먹습니다". 이는 예상 한 것과 다를 수 있습니다.

+0

+1 비 탐심에 대한 귀하의 권리, 그러나 그 가치를 언급하는 것은'!! 이 !! will :: be :: consumed !! '도 마찬가지입니다. – sln

+0

@sln : 동의 함. 그러나 OP가 말했듯이,'::'이전의 텍스트는 무엇이든 될 수 있습니다. 즉,'!! '을 포함 할 수 있습니다. 귀하의 예제에서 내 정규식은'this !! will be'와':: be :: :: 소비된다. 이게 좋은 일입니까 나쁜 일입니까? OP 만 대답 할 수 있다고 생각합니다. –

0

\S이 문제가되었지만, Igor Korkhov가 언급했듯이,
내용이 delimeter와 일치하지 않으면 문제가있을 것입니다.

실제 보호 기준이 없습니다.
delimeters는 !!::이며, 내용물은
이며 텍스트 부분이 아니어야합니다.

델리 미터로만 존재한다고 말하면 앞서 언급 한 바와 같이
비 탐욕적인 방법을 사용해야합니다. 그렇지 않으면 오버런이 발생합니다.

delimeters 밖의 텍스트로 존재할 수 있고
!! :: !! 양식이 완벽하다고 말하면 구문 분석 방법은 하나뿐입니다.

!!((?:(?!::|!!)[\s\S])*)::((?:(?!!!|::)[\s\S])*)!!
또는
!!(?<first>(?:(?!::|!!)[\s\S])*)::(?<last>(?:(?!!!|::)[\s\S])*)!!