簡體   English   中英

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

[英]Using Regex.Replace() to replace text in a string

我想使用Regex.Replace()遍歷包含以'//'分隔的單詞的字符串,以檢查是否有單詞與傳遞給該方法的字符串值匹配。 如果文本字符串確實與wordList中的一個單詞匹配,則將其替換並返回“ matched”,如果與任何單詞都不匹配,則返回傳遞給該方法的原始單詞,而不替換它。

這是我目前的代碼:

    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中的任何單詞都不匹配,則返回原始字符串,而不要替換它。

您不需要正則表達式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中,則上面的函數將返回“ matched”,否則不返回text參數本身。

如果只想替換字符串,則可能要使用String.Replace 也許,如果您包括給定輸入的預期結果,我們可能會更好地為您提供幫助。

如果您的意思是任何一個單詞都應該匹配,那么您將需要一個正則表達式,例如

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中的內容。

如果您確實想通過正則表達式來執行此操作,則可以將其用作字符串的擴展方法:

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

:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM