【问题标题】:Regular expressions replace string containing character @正则表达式替换包含字符@的字符串
【发布时间】:2015-06-29 06:17:45
【问题描述】:

我有一个函数应该用要替换的字符串以@ 开头的条件替换在另一个字符串中找到的任何字符串,并且只有当它是一个完整的单词时才必须替换它。

但是下面的代码不起作用。问题在于字符@,因为如果我在开头使用另一个字符,例如 X,它会起作用。然而,即使将@ 符号放在方括号之间也无济于事。

public static string DB_Replace_Str(string st, string stFrom, string stTo)
{         
    stFrom = stFrom.Replace("@", "[@]");//this does not help
    string pattern = @"\b" + stFrom + @"\b";
    return Regex.Replace(st, pattern, stTo);
}

我在这里发布了一些示例字符串:

  • st = "SELECT @table_Software.*, @table_Teile.@Id as @TeilId FROM @table_Software LEFT JOIN @table_Teile ON @table_Software.@Id = @table_Teile.@Software_Id WHERE @table_Software.@Id = 11"
  • stFrom = "@table_Software"
  • stTo = "tblSoftware"

【问题讨论】:

  • 您能否展示您将在变量ststFromstTo 中传递的字符串示例,因为它目前编写的内容很难准确理解您要尝试的内容达到。
  • 从您的描述看来,regex 似乎不适合使用,C# 有很多(内置)方法来检查字符串包含的内容。
  • 这些是输入吗? string st = "aaaa @bbb ccc ddd eee fff";字符串 stFrom = "bbb";字符串 stTo = "XXX";字符串 ret = "aaaa XXX ccc ddd eee fff"; ?
  • 我正在尝试发布字符串,但在 stackoverflow 中出现错误:“只有一个额外的 @user 等....”stackoverflow 也被 @ 字符混淆
  • 我不想破坏您的研究,但有一种方法可以“返回一个新字符串,其中当前实例中出现的所有指定字符串都替换为另一个指定字符串。”请阅读How to Ask 并尝试花时间整理您的问题。

标签: c# regex replace


【解决方案1】:

需要先指定非词边界,再指定词边界:

来自Regular-Expressions.info的详细信息:

\b 允许您使用\bword\b 形式的正则表达式执行“仅整个单词”搜索。 “单词字符”是可用于构成单词的字符。所有不是“单词字符”的字符都是“非单词字符”。
\B\b 的否定版本。 \B 匹配 \b 不匹配的每个位置。实际上,\B 匹配两个单词字符之间的任何位置以及两个非单词字符之间的任何位置。

public static string DB_Replace_Str(string st, string stFrom, string stTo)
{
    string pattern = string.Format("\\B{0}\\b", stFrom);
    return Regex.Replace(st, pattern, stTo);
}

甚至:

public static string DB_Replace_Str(string st, string stFrom, string stTo)
{
    return Regex.Replace(st, string.Format("\\B{0}\\b", Regex.Escape(stFrom)), stTo);
}

输出:

SELECT tblSoftware.*,  @table_Teile.@Id as @TeilId FROM tblSoftware LEFT JOIN @table_Teile ON tblSoftware.@Id = @table_Teile.@Software_Id WHERE  tblSoftware.@Id = 11

【讨论】:

  • 我认为我们可以改进一下。除了创建临时变量,我们可以在Regex.Replace 中使用string.Format...,也许我们还应该使用Regex.Escape 转义stFrom 中的任何元字符(尽管如果末尾有任何非单词字符的stFrom,我们不会得到匹配:()
【解决方案2】:

您需要删除单词边界。因为我认为 start 和 [ 之间不存在单词边界

string pattern = @"(?<!\S)" + stFrom + @"(?!\S)";

string pattern = @"\B" + stFrom + @"\B";

为什么将X 放在开头会起作用?因为X[之间存在单词边界。

【讨论】:

  • 如果我删除了单词边界,那么当字符串不是完整的单词(例如,较长单词的一部分)时,该函数也会替换字符串
  • 我已经用示例字符串更新了我的答案文本。
  • 我的不适合你?您的预期输出是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 2018-07-13
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多