c# Regex replace with insert

本文关键字:insert with replace Regex | 更新日期: 2023-09-27 18:19:35

我需要环绕所有'&'字符串中包含"|",但前提是该字符串中还没有"|"例如以下字符串(-->预期结果):

  1. "我和你"-->"我|和|你"
  2. "我|&你"-->不更改
  3. "我和|你"-->不更改
  4. "我和你"-->"我|和|你"

我找到了选择器(至少我认为),它将赶上示例1和4

[^|]&[^|]

但现在我一直在创建替换模式。我知道我需要一些东西来复制"&amp但无法使其工作。最接近的结果是

|&|

但这也去除了"&amp

注意:我不能使用

s.Replace("&", "|&|").Replace("||&", "|&").Replace("&||", "&|"); 

因为字符串的开头可能已经包含"||&",这无论如何都不会产生预期的结果。

也欢迎任何regex的替代方案!

c# Regex replace with insert

您需要使用负先行和后向:

(?<!'|)&(?!'|)

这应该适用于您的示例:

static void Main(string[] args)
{
    List<string> tests = new List<string>();
    tests.Add("Me&You");
    tests.Add("Me|&You");
    tests.Add("Me&|You");
    tests.Add("Me & You");
    foreach (var item in tests)
    {
        Console.WriteLine("{0}: {1}", item,
                          Regex.Replace(item, @"(?<!'|)&(?!'|)", "|&|"));
    }
    Console.ReadKey();
}

用正则表达式搜索'|?&'|?并替换为|&|是一种简单的方法。这适用于线条的起点和终点以及线条内部。

表达式在&之前和之后查找零个或一个|字符,并用所需文本替换所有四个变体(即&|&|&|&|)。当现有的|字符正确时,表达式不会尝试将其单独保留。