我想使用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字符串,不要替换它。
答案 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);
:)