2012-12-24 2 views
5

일치를 찾으려면 RegEx 패턴의 심볼을 사용하고 싶습니다.하지만 교체하지 않으려합니다. 이것은 C#에서 클래스 및 네임 스페이스 조작을위한 것입니다. 예를 들어RegEx - 심볼을 사용하지만 일치하지 않습니다.

:

MyNamespaceLib.EntityDataModel.TestsMyClass+MyInnerClass

은 (참고 만 "검사는"이 나타나면 교체입니다 :

MyNamespaceLib.EntityDataModelTests.TestsMyClassTests+MyInnerClassTests

는 다음과 같이 교체해야합니다 끝에 네임 스페이스 부분의 부분이 아니라 클래스/네임 스페이스 부분 일 때)

일치 항목을 찾는 첫 번째 부분을 얻을 수 있었지만 대체 된 일치 항목에 기호를 유지하려고 진압하고 있습니다.

var input = "MyNamespaceLib.EntityDataModelTests.TestsMyClassTests+MyInnerClassTests";

var output = Regex.Replace(input, "Tests[.+]|$", "");

가 '비 캡처 그룹을 사용하여 시도했지만, 나는 그것이 난 길을 의미하지 용의자 :

지금까지 내가 가진 그것을 사용하려고합니다.

감사합니다.

답변

6

그래서 이 아니고 . 또는 +이 뒤따라야합니다.

@"Tests(?![.+])" 
+0

아니요, 그 반대입니다. 필자는 기본적으로 ".", "+"또는 줄 끝으로 끝나는 일치 항목을 바꾸려고합니다. 그러나 단어 "Tests"가 네임 스페이스 또는 클래스 이름 내에 나타나면 바꿔서는 안됩니다. – Steve

+0

@ user1927385 :'테스트 (?! [^. +])',. – Ryan

+0

니스, 완벽하게 작동했습니다. 나는 Regex에서 lookaheads를 사용한 적이 없기 때문에 좀 더 읽을 것입니다. 고마워요 minitech. – Steve

1

당신은 문자열을 즉시 생성하여 경기를 대체 할 Regex.Replace 방법의 MatchEvaluator 오버로드를 사용하십시오 lookahead을 사용합니다. 당신이 할 수있는, minitech의 의견에 따라,

var output = Regex.Replace(input, @"Tests([.+]|$)", m => m.Groups[1].Value); 

또한 : 나는 캡처 그룹의 특별한 simbol와를 얻을 수 (첫 번째 캡처 그룹은 경기 중 항상 그룹 1이다),이 같은 값으로 경기를 교체 또한 같은 Regex.Replace의 (문자열, 문자열) 과부하의 첫 번째 캡처 그룹 $ 1을 사용 : 당신은 바보을 항상 할 수 있도록했다

var output = Regex.Replace(input, @"Tests([.+]|$)", "$1"); 

, 정규식이 종종 쓰기 전용 코드 간단한 교체 :

var output = input.Replace("Tests+","").Replace("Tests.","") ...; 
+0

그래, 작동 할거야, 내가 한 RegEx 패턴으로 다 끝내려고했다. 이 일을 끝내지 못하면 마지막으로. – Steve

+0

그래,이 [이 Regex.Replace 과부하 (http://msdn.microsoft.com/en-us/library/cft8645c.aspx), 나는 잠시 예를 요리하려고합니다 이루어집니다. 'Regex.Replace (..., "$ 1")' – SWeko

+0

, 당신은 문자열 내부에 있다고 할 수 있습니다. 어쨌든, 나는 lambdas를 좋아한다 :) – Ryan

관련 문제