C# 多个单词中具有相同值的字符串中的Regex Replace

C# 多个单词中具有相同值的字符串中的Regex Replace,c#,regex,C#,Regex,我想用引号替换字符串 Mystring如下所示: var query = "SELECT abc.name,abc.owner-name FROM XXX"; 我想如下替换字符串。预期结果 SELECT abc."name",abc."owner-name" FROM XXX 我使用的正则表达式代码如下: Regex.Replace(query, $@"\b{column.ColumnName}\b", "\"" + column.ColumnName + "\"") 在替换以下字符串时,

我想用引号替换字符串

Mystring
如下所示:

var query = "SELECT abc.name,abc.owner-name FROM XXX";
我想如下替换字符串。预期结果

SELECT abc."name",abc."owner-name" FROM XXX
我使用的正则表达式代码如下:

Regex.Replace(query, $@"\b{column.ColumnName}\b", "\"" + column.ColumnName + "\"")
在替换以下字符串时,将获得结果-

SELECT abc."name",abc."owner-"name"
名称是单独的字符串,所有者名称是单独的字符串。当尝试替换名称字符串时,另一个字符串将自动被替换,因为第二个字符串中包含单词name


如果有什么解决办法,请告诉我。提前谢谢。

您需要确保先放长一点的。您可以创建列名列表,按长度降序排序,并构建一个替代组以形成类似正则表达式的

\b(?:owner-name|owner|name)\b
看。请注意,从左到右检查备选方案,一旦存在匹配项,将跳过下一个备选方案

以下是以动态方式处理项目的代码段(请参阅):

var ColumnNames=新列表{“所有者”、“名称”、“所有者名称”};
ColumnNames=ColumnNames.OrderByDescending(x=>x.Length.ToList();
var s=“从XXX中选择abc.name、abc.owner-name”;
var pattern=$@“\b(?:{string.Join(|“,ColumnNames)})\b”;
var result=Regex.Replace(s,pattern,“\”$&\”);
控制台写入线(结果);
//=>从XXX中选择abc.“名称”,abc.“所有者名称”

确保转义不需要的字符串/字符

\b[^-]name\b
此处转义
'-'
,它位于
[]
内,并匹配字符串“
名称


使用来测试表达式。

创建一个列名列表,按长度降序排序,构建一个替代组,如
$@“\b(?:{string.Join(“|”),ColumnNames})\b”
并替换为
“\”$&\”
\b[^-]name\b
匹配任何以单词边界开头的字符串,然后是除
-
以外的任何字符,然后是
名称
,后跟单词边界。例如,它将匹配
“他的名字”
中的
“名字”
。你在这里什么也逃不了。我不确定这个答案是否相关,为什么你建议“逃离”“不想要的”字符?问题中没有关于特殊字符的内容。
\b[^-]name\b