2014-04-03 3 views
1

Ive는 비슷한 주제를 가지고 있었지만 새로운 것을 묻고있는 메신저를 찾을 수 없었습니다.RegEx가 일치 항목의 일부만 바꾸기

RegEx와 일치하는 문자열의 일부만 대체 할 수 있습니까? 예를

를 들어

나는 +NN00NN를 교체합니다. 00 ~ +에 대한 간단한 교체만으로는 옵션이 아닙니다.

아래 정규식은 2가 0이고 1-9가 2 사이입니다. 킵 교체가 가능한 경우

Dim PhoneNumber AS String = Regex.Replace(IndexString, "([0][0][1-9]{2})", "+") 

이것은 전체 00NN-+를 대체 그래서 당신은 당신이 원하는 경우에만 일치 lookaheads을 사용할 수 있습니다 00NN

답변

5

예,이 두 가지 방법이 있습니다 :

  1. 유지하려는 부분을 저장하는 capturing group를 사용하여 여기에

    Dim PhoneNumber AS String = Regex.Replace(IndexString, "\b00([1-9]{2})", "+$1")

    는, 괄호는 관련 부분을 캡처 (순차적으로 번호가 매겨집니다.) 그리고 첫 번째 그룹의 일치를 위해 $1, 두 번째 그룹의 $2 등을 사용하여 바꾸기 문자열에서 해당 내용을 다시 참조 할 수 있습니다. (전체 경기는 $0).

  2. 는 사용하십시오 positive lookahead assertion :

    여기

    Dim PhoneNumber AS String = Regex.Replace(IndexString, "\b00(?=[1-9]{2})", "+")

    , (?=...) 만 실제로 그 경기의 일부 않고 현재 위치에서 ...에 맞게 가능 을 있다고 주장한다. 이 솔루션은 아마도 첫 번째 솔루션보다 빠릅니다.

한가지 더 : 당신은 사용해야합니다 word boundary anchor (\b) 실수 숫자의 중간에 00 일치하지 않는 것을 확인 할 수 - 당신은 아마 +49301+23456가되고 00493010023456 싶지 않아, 당신을 ?

+0

감사합니다. 캡처 그룹은 매우 흥미 롭습니다. 다른 문제와 관련하여 도움이 될 것입니다.) –

+0

Tim,이 방법을 적용했는데, 다시 응답 할 수 있었으면 좋겠습니다. –

+0

@KayNelson - 첫 번째 사람에게는 실망 스러울 지 모르지만 Tim이 이미 많은 평판을 가지고 있음을 알고 있습니다. Tim의 대답이 실제로 최고라고 생각하면 처음 선택한 답변을 선택 취소하고 Tim을 선택해야합니다. 확실히 좋은 대답이라면 첫 번째 사람의 답변을 upvote하십시오.) - 나중에 여기에 오는 누군가가 가장 좋은 대답을 먼저 볼 수 있습니다. –

2

+NN에 대체 NN을 다음

Regex.Replace(IndexString, "00(?=[1-9]{2}))", "+") 

(?=...)은 일치하는 항목이있는 경우에만 일치하는 제로 너비 어설 션이므로 선택없이 원하는 확인을 수행합니다 NN.

+0

우수! 완벽하게 일했습니다! –

관련 문제