2010-05-26 1 views
1

Regex.Replace()를 사용하여 단어가 문자열 값과 일치하는지 확인하기 위해 '//'로 구분 된 단어가 포함 된 문자열을 반복합니다. 방법에 전달 된 텍스트 문자열이 wordList에있는 단어 중 하나와 일치하면 대체하고 'matched'를 반환합니다. 일치하는 단어가 없으면 메서드에 전달 된 원래 단어를 반환하고 바꿉니다.Regex.Replace()를 사용하여 문자열의 텍스트 바꾸기

여기 내 코드는 순간입니다 :

public void CheckText(string text) 
    { 
     //Check text entered by user 

     string wordList = "word1//word2//word3 etc..."; 
     string replaceString = "matched"; 

     if (!string.IsNullOrEmpty(wordList)) 
     { 
      //How do I implement this part? 
      return Regex.Replace(text, wordList, replaceString); 
     } 
    } 

사람이 좀 도와 주 시겠어요? 어떤 도움/의견을 부탁드립니다!

업데이트 : 귀하의 답변에 대한

감사 (Update에서 붙여 넣기가 영업 이익의 답변으로 게시 질문에). 아마 질문을 올바르게 설명하지 않았을 것입니다. wordList의 문자열과 일치하는 경우 전달되는 텍스트 문자열을 대체하는 메서드를 원합니다. 예를 들어 'word1'이 메서드에 전달되면 메서드는 'word1'이 wordList에 있는지 확인하고 일치하는 경우 메서드에 전달 된 원래 문자열을 'matched'로 바꾸고 ' 매치 된 '단어 목록에있는 단어 중 하나와 일치하지 않으면 orignial 문자열을 반환하고 바꿉니다.

+0

그것은 분명하지 않다 무엇을 당신은 돌아가고 싶다. 'void'는 아무 것도 반환하고 싶지 않다는 것을 의미합니다. 메서드 이름'CheckText'는 * Boolean * 값을 반환하고 줄 반환 값은 (Regex.Replace'에서) * 문자열 * 값을 반환 할 것을 제안합니다. . 어쩌면 당신이 성취하고자하는 것을 분명히 할 수 있으며 우리는 당신을 더 잘 도울 수 있습니다. – dariom

답변

1

당신이 그 단어 중 하나가 일치해야한다는 것을 의미하는 경우

new Regex("(word1)|(word2)|(word3)"); 

그래서 당신은 정규식으로 단어 목록을 변환해야 할 것 같은, 당신은 정규식이 필요합니다

string wordList = "word1//word2//word3"; 
// search every word that ends with '//' or with the end of the string 
// then replace it by (word)| 
// trim the last '|' 
string transformed = Regex.Replace(wordList, @"(\w{1,})(//|$)", "($1)|").TrimEnd('|'); 

// transformed contains (word1)|(word2)|(word3) now 

이제 transformed을 정규식으로 사용하십시오. 응답

return Regex.Replace(text, transformed, replaceString); 

사용

string result = new Regex(transformed).Match(text).Success ? replaceString : ""; 

일치하지 않을 경우 빈 문자열,하고 ReplaceString에서 다른 내용을 반환 언급합니다.당신이 정말로 정규식하여 수행 할 경우

+0

회신 및 코드 예제를 보내 주셔서 감사합니다. 이는 내가 원하는 코드의 일종이라고 생각합니다. 기본적으로 나는 method에 전달 된 단어를 wordList의 단어 중 하나와 일치하면 'matched'로 바꾸고, wordList의 단어 중 하나와 일치하면 'matched'를 반환하고, 그렇지 않으면 그 (것)들의 무엇이든은 orignal 원본 끈을 돌려 보내고 그것을 대체하지 않는다. – Theomax

+0

내 의견보기. –

4

당신은 이것에 대한 정규식이 필요하지 않습니다 - 잘 작동 것 String.Replace을 - 그것은 또한 더 읽을 수 :

public void CheckText(string text) 
{ 
    string wordList = "word1//word2//word3 etc..."; 
    string replaceString = "matched"; 

    return wordList.Replace(text, replaceString); 
} 

업데이트 : (다음 업데이트 질문)

당신은 단순히 원하는 경우 전달 된 문자열이 단어 목록에 있는지 확인하려면 String.IndexOf을 사용하면됩니다 (존재하지 않으면 -1이 반환 됨). 당신은 그러나 함수의 반환 유형을 지정하지 않은, 그래서 나는 다시 그 결과를보고 할 것으로 예상 방법을 모른다 :

public string CheckText(string text) 
{ 
    string wordList = "word1//word2//word3 etc..."; 
    if(wordList.IndexOf(text) > -1) 
     return "matched"; 

    return text; 
} 

텍스트 매개 변수에 전달 된이 포함되는 경우 위의 기능은 "일치"를 반환합니다 wordList에, 텍스트 매개 변수 자체가 아니라면.

1

문자열 만 바꾸려면 String.Replace을 사용하는 것이 좋습니다. 어쩌면 주어진 입력에 대해 예상되는 결과가 포함되어 있다면 우리는 더 나은 결과를 얻을 수 있습니다.

1

당신은 문자열 확장 메서드로 사용할 수 있습니다 : 다음

private static Dictionary<string, Regex> regexCache = new Dictionary<string, Regex>(); 
public static string RegexReplace(this string value, string pattern, string replacement) 
{ 
    return RegexReplaceInternal(value, pattern, replacement, RegexOptions.Compiled); 
} 

private static object rriLocker = new object(); 
private static string RegexReplaceInternal(string value, string pattern, string replacement, RegexOptions regexOptions) 
{ 
    bool isInCache; 
    lock (rriLocker) 
    { 
     isInCache = regexCache.ContainsKey(pattern); 
    } 
    if (isInCache) 
    { 
     return regexCache[pattern].Replace(value, replacement); 
    } 
    lock (rriLocker) 
    { 
     Regex rx = new Regex(pattern, RegexOptions.Compiled); 
     regexCache.Add(pattern, rx); 
     return rx.Replace(value, replacement); 
    } 
} 

과 :

var expression = string.Concat("(", wordList.Replace("//", "|"), ")"); 
var output = text.RegexReplace(expression, replaceString); 

:

+0

멋진 게시물 정말 도움이 미래에 –

관련 문제