我正在尝试替换文件中的一堆字符串。字符串与新字符串值一起存储在数据表中。
string contents = File.ReadAllText(file);
foreach (DataRow dr in FolderRenames.Rows)
{
contents = Regex.Replace(contents, dr["find"].ToString(), dr["replace"].ToString());
File.SetAttributes(file, FileAttributes.Normal);
File.WriteAllText(file, contents);
}
字符串看起来像_-uUa
,-_uU
,_-Ha
等。
我遇到的问题是,例如,此字符串“_uU
”也会覆盖“_-uUa
”,因此替换会看起来像“newvaluea”
有没有办法告诉正则表达式查找找到的字符串后面的下一个字符,并确保它不是字母数字字符?
我希望很清楚我在这里要做什么。 以下是一些示例数据:
private function _-0iX(arg1:flash.events.Event):void
{
if (arg1.type == flash.events.Event.RESIZE)
{
if (this._-2GU)
{
this._-yu(this._-2GU);
}
}
return;
}
接下来的字符可以是;
,(
,)
,点,逗号,空格,:
等。
答案 0 :(得分:0)
首先,您应该使用Regex.Escape
。
您可以使用
contents = Regex.Replace(
contents,
Regex.Escape(dr["find"].ToString()) + @"(?![a-zA-Z])",
Regex.Escape(dr["replace"].ToString()));
甚至更好
contents = Regex.Replace(
contents,
@"\b" + Regex.Escape(dr["find"].ToString()) + @"\b",
Regex.Escape(dr["replace"].ToString()));
答案 1 :(得分:0)
我认为这就是你要找的东西:
contents = Regex.Replace(
contents,
string.Format(@"(?<!\w){0}(?!\w)", Regex.Escape(dr["find"].ToString())),
dr["replace"].ToString().Replace("$", "$$")
);
您无法使用\b
,因为搜索字符串并不总是以字符开头和结尾。相反,我使用(?<!\w)
和(?!\w)
来确保匹配的子字符串不会立即在单词字符前面或后面跟着(即字母,数字或下划线)。我不知道你的搜索字符串的完整规范,所以这种模式可能需要一些调整。
您提供的样本模式都不包含正则表达式元字符,但与其他响应者一样,我使用Regex.Escape()
来保证其安全。在替换字符串中,您需要注意的唯一字符是美元符号(ref),以及另一个美元符号的逃脱方式。请注意,我使用String.Replace()
代替Regex.Replace()
。
答案 2 :(得分:0)
有两种技巧可以帮助你:
选项一很简单,选项二看起来像这样:
Regex.Replace(contents", "_-\\w+", ReplaceIdentifier)
public string ReplaceIdentifier(Match m)
{
DataRow row = FolderRenames.Rows.FindRow("find"); // Requires a primary key on "find"
if (row != null) return row["replace"];
else return m.Value;
}