1

我正在尝试替换文件中的一堆字符串。字符串与新的字符串值一起存储在数据表中。

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

下一个字符可以是;, (, ), 点, 逗号, 空格,:等。

4

3 回答 3

0

这里有两个技巧可以帮助你:

  1. 按长度对所有搜索字符串进行排序,并首先替换最长的字符串,这样您就不会意外替换较短的字符串。
  2. 使用 MatchEvaluator,而不是遍历所有行,而是搜索字符串中的所有替换模式并在数据集中查找它们。

选项一很简单,选项二看起来像这样:

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;
}
于 2012-11-25T11:02:02.320 回答
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()));
于 2012-11-24T20:12:19.410 回答
0

我想这就是你要找的:

contents = Regex.Replace(
    contents,
    string.Format(@"(?<!\w){0}(?!\w)", Regex.Escape(dr["find"].ToString())),
    dr["replace"].ToString().Replace("$", "$$")
);

您不能使用\b,因为您的搜索字符串并不总是以单词字符开头和结尾。相反,我使用(?<!\w)and(?!\w)来确保匹配的子字符串不是紧跟在单词字符(即字母、数字或下划线)之前或之后。我不知道您的搜索字符串的完整规范,所以这个模式可能需要一些调整。

您提供的示例模式均不包含正则表达式元字符,但与其他响应者一样,我过去总是将Regex.Escape()其呈现为安全的。在替换字符串中,您需要注意的唯一字符是美元符号 ( ref ),而逃避它的方法是使用另一个美元符号。请注意,我使用String.Replace()它而不是Regex.Replace().

于 2012-11-24T23:35:36.273 回答