我有一个foreach语句,正在List<string>
内搜索字符串值。如果正在读取的当前行包含字符串,我想替换它,但有一些警告。
foreach (string shorthandValue in shorthandFound)
{
if (currentLine.Contains(shorthandValue))
{
// This method creates the new string that will replace the old one.
string replaceText = CreateReplaceString(shorthandValue);
string pattern = @"(?<!_)" + shorthandValue;
Regex.Replace(currentLine, pattern, replaceText);
// currentline is the line being read by the StreamReader.
}
}
如果shorthandValue
前面有下划线字符("_"
),我正试图让系统忽略字符串。否则,我希望它被替换(即使它在行的开头)。
我做得不好?
更新
这大部分工作正常:
Regex.Replace(currentFile, "[^_]" + Regex.Escape(shorthandValue), replaceText);
然而,虽然它确实忽略了下划线,但它在shorthandValue字符串之前删除了任何空格。因此,如果该行显示“This is a test123。”,并且“test123”被替换,我最终得到了这个结果:
“这是一个不错的选择。”
为什么要删除空间?
再次更新
我将正则表达式更改回(?<!_)
并保留了空格。
答案 0 :(得分:3)
你的正则表达式是正确的。问题是Regex.Replace返回一个新字符串。
您忽略了返回的字符串。
答案 1 :(得分:1)
您的正则表达式看起来是正确的,因为您修改了代码以实际保存字符串(帽子提示为@jameskyburz),因此您仍应确保将shorthandValue
视为文字。要完成此操作Regex.Escape
:
var pattern = String.Format(@"(?<!_){0}", Regex.Escape(shorthandValue))