【问题标题】:Replace only substrings that have specified string before and specified string after [duplicate]仅替换在 [重复] 之前指定字符串和指定字符串之后的子字符串
【发布时间】:2019-08-19 08:22:39
【问题描述】:

我想替换之前指定子字符串和之后指定子字符串的字符串中的子字符串。

我有字典:

Dictionary<string, string> map = new Dicrionary<string, string>
{
   {"From","DateFrom"}
}

表示源字符串中名称的转换。

那么我有:

var source = "(From|DistanceFrom|Name)";
foreach (var key in map.Keys)
{
   var findWholeVarsNamesPattern = $"^({key})$|(\\({key}\\|)|(\\|{key}\\))|(\\|{key}\\|)";
   source = Regex.Replace(source, map[key], findWholeVarsNamesPattern);
}

如何修改findWholeVarsNamesPattern 以仅替换源中的"From" 子字符串而不是"(From|" 但不修改"DistanceFrom"

所以总结一下,我希望替换单词 "From" 具有:

  • 或前后均无或
  • 在 or 之后有“(”,在 or 之后有“|”
  • 有“|”之前和“|”之后或
  • 有“|”之前和之后的“)”。

【问题讨论】:

  • 也许将关键字包含在单词边界内(即\\b{key}\\b)?
  • 请注意,单词边界可能仅在键内部没有空格或其他非单词字符时才有效。另一种方法可能是按长度按降序对键进行排序。
  • 您可以使用$@"^{key}$|(?&lt;=\(){key}(?=\|)|(?&lt;=\|){key}(?=[)|])" 修复您当前的方法并使用source = Regex.Replace(source, findWholeVarsNamesPattern, map[key]);
  • @H.Wojtowicz 您的来源可以包含非单词字符,例如"(From-One|DistanceFrom|Name)";?在这种情况下,是否应该更换?空格呢?

标签: c# regex replace .net-core


【解决方案1】:

您的 Regex.Replace 顺序错误,应该是 string input, string pattern, string replacement。试试这个模式:

var findWholeVarsNamesPattern = $@"\b{key}\b";   
source = Regex.Replace(source, findWholeVarsNamesPattern, map[key]);

【讨论】:

  • 请注意,如果key 包含非单词字符,则此方法可能不起作用。
  • @WiktorStribiżew 是的,OP 必须澄清是否允许这样做,我会问
  • \\b{key}\\b 足以满足要求。谢谢!
  • @WiktorStribiżew 实际上key 可以包含非单词字符,但source 中的字符串不能。例如,From- 之类的键可以正确替换(From-|...) 之类的源,但具有From 键的相同源会失败
猜你喜欢
  • 2022-11-23
  • 2012-09-04
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
相关资源
最近更新 更多