正则表达式仅替换整个匹配项

时间:2012-11-24 20:05:53

标签: c# regex

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

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

接下来的字符可以是;(),点,逗号,空格,:等。

3 个答案:

答案 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)

有两种技巧可以帮助你:

  1. 按长度排序所有搜索字符串,并先替换最长的搜索字符串,这样就不会意外地替换较短的搜索字符串。
  2. 使用MatchEvaluator而不是循环遍历所有行,搜索字符串中的所有替换模式并在数据集中查找它们。
  3. 选项一很简单,选项二看起来像这样:

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