使用Regex.Replace()替换字符串中的文本

时间:2010-05-26 10:09:05

标签: c#

我想使用Regex.Replace()循环包含由'//'分隔的单词的字符串,以检查是否有任何单词匹配已传递给方法的字符串值。如果文本字符串与wordList中的某个单词匹配,则替换它并返回“匹配”,如果它与任何单词都不匹配,则返回传递给方法的原始单词,不要替换它。

这是我目前的代码:

    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); 
        }
    }

有人可以帮帮我吗?任何帮助/意见将不胜感激!

更新(从OP更新贴到问题的答案)

感谢您的回复。我可能没有正确解释这个问题。我希望该方法替换它传递的文本字符串,如果它匹配wordList中的字符串。例如,'word1'被传递给方法,然后该方法检查'word1'是否在wordList中,如果是,则用'matched'替换传递给方法的原始字符串,然后返回'匹配',如果它与wordList中的任何单词都不匹配,则返回orignial字符串,不要替换它。

4 个答案:

答案 0 :(得分:4)

你不需要一个RegEx - 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; 
}

如果传入的text参数包含在wordList中,则上面的函数将返回“匹配”,如果不包含,则返回text参数本身。

答案 1 :(得分:1)

如果您只想替换字符串,则可能需要使用String.Replace。也许如果你包括给定输入的预期结果,我们可以帮助你更好。

答案 2 :(得分: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的内容。

答案 3 :(得分: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);

:)