C# 用另一个字符串替换任一字符串
我想用C# 用另一个字符串替换任一字符串,c#,regex,C#,Regex,我想用Hdp替换Hvos或Hc: var hvos = "Dhhs.Hvos.Automation.UI"; var hc = "Dhhs.Hc.Automation.UI"; var pattern = "H(c|v)*(os)"; var replacement = "Hdp"; var str1 = Regex.Replace(hc, pattern, replacement).Replace("UI
Hdp
替换Hvos
或Hc
:
var hvos = "Dhhs.Hvos.Automation.UI";
var hc = "Dhhs.Hc.Automation.UI";
var pattern = "H(c|v)*(os)";
var replacement = "Hdp";
var str1 = Regex.Replace(hc, pattern, replacement).Replace("UI", "Data");
Console.WriteLine(str1);
var str2 = Regex.Replace(hvos, pattern, replacement).Replace("UI", "Data");
Console.WriteLine(str2);
但只有Hvos
被替换,而Hc
没有:
Dhhs.Hc.Automation.Data
Dhhs.Hdp.Automation.Data
str1
和str2
应该是相同的。在您尝试的模式中,这部分(c | v)*
匹配了0+次c
或v
,例如也可以匹配ccc
或cvvc
您可以使用字符类编写模式,该字符类带有可选部分以匹配os
,并使用单词边界\b
防止部分匹配
\bH[cv](?:os)?\b
注意模式也将匹配HCO
正如作者在评论中指出的,这种模式将更精确地匹配:
\bH(?:c|vos)?\b
在您尝试的模式中,此部分
(c | v)*
匹配0+次c
或v
,例如也可以匹配ccc
或cvvc
您可以使用字符类编写模式,该字符类带有可选部分以匹配os
,并使用单词边界\b
防止部分匹配
\bH[cv](?:os)?\b
注意模式也将匹配HCO
正如作者在评论中指出的,这种模式将更精确地匹配:
\bH(?:c|vos)?\b
创建一个执行此操作的方法,并为两个值调用它
字符串s=str.Replace(“Hvos”,“Hdp”)。Replace(“Hc”,“Hdp”) 创建一个执行此操作的方法,并为两个值调用它
字符串s=str.Replace(“Hvos”,“Hdp”)。Replace(“Hc”,“Hdp”) 因为(os)不是可选的,但我认为最好是完整的“H((vos)| c)”。(不确定这是否完全正确。)为什么要用正则表达式来表示这么简单的事情。您可以使用String.Replace。如果您想让str1与str2相等,那么只需使用str2=str1;因为在“.Hc.”中没有操作系统,您正在寻找可选字符
?
。例如,ab?c
将匹配abc或ac,或者围绕(hvos | hc)h(vos | c)@jdweng写入您的或其他方式,因为它们不会同时被调用<代码>str1和str2
不会出现在同一位置。这只是为了模拟replacement.string.Replace不起作用?因为(os)不是可选的,但我认为最好执行完整的“H((vos)| c)”。(不确定这是否完全正确。)为什么要用正则表达式来表示这么简单的事情。您可以使用String.Replace。如果您想让str1与str2相等,那么只需使用str2=str1;因为在“.Hc.”中没有操作系统,您正在寻找可选字符?
。例如,ab?c
将匹配abc或ac,或者围绕(hvos | hc)h(vos | c)@jdweng写入您的或其他方式,因为它们不会同时被调用<代码>str1和str2
不会出现在同一位置。这只是为了模拟替换。string.Replace不起作用吗?我想他是在做别的事情。我想他是在做别的事情。请你解释一下。我现在明白了*
需要在(os)
之后,而不是在它之前。请注意,如果您只是(os)*
,它也可能匹配ososos
,非常确定在这种情况下字符串将保持不变,但很好。感谢您的解释。我现在明白了*
需要在(os)
之后,而不是在它之前。请注意,如果您只是(os)*
,它也可能匹配ososos
,非常确定字符串在这种情况下会保持不变,但这一点很好。