c#正则表达式替换为插入

c#正则表达式替换为插入,c#,regex,C#,Regex,我需要用字符串中的“|”来包围所有的“&”,但前提是那里还没有“|” 例如,以下字符串(->预期结果): “我和你”->“我和你” “我和你”——不要改变 “我和你”——不要改变 “我和你”->“我和你” 我找到了选择器(至少我认为),它将捕获示例1和4 [^|]&[^|] 但现在我被困在创建替换模式。 我知道我需要在“&”前后复制部件,但无法使其工作。最接近的结果是 |&| 但这也会删除“&”前后的字符 注意:我不能使用 s.Replace("&", "|&

我需要用字符串中的“|”来包围所有的“&”,但前提是那里还没有“|” 例如,以下字符串(->预期结果):

  • “我和你”->“我和你”
  • “我和你”——不要改变
  • “我和你”——不要改变
  • “我和你”->“我和你”
  • 我找到了选择器(至少我认为),它将捕获示例1和4

    [^|]&[^|]
    
    但现在我被困在创建替换模式。 我知道我需要在“&”前后复制部件,但无法使其工作。最接近的结果是

    |&|
    
    但这也会删除“&”前后的字符

    注意:我不能使用

    s.Replace("&", "|&|").Replace("||&", "|&").Replace("&||", "&|"); 
    
    因为字符串开头可能已经包含“| |&”,因此无论如何都不会创建预期的结果


    也欢迎任何regex的替代方案

    您需要使用负向前看和向后看:

    (?<!\|)&(?!\|)
    

    (?根据您的示例,这应该是可行的:

    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();
    
    }
    
    static void Main(字符串[]args)
    {
    列表测试=新列表();
    测试。添加(“我和你”);
    测试。添加(“我和你”);
    测试。添加(“我和你”);
    测试。添加(“我和你”);
    foreach(测试中的var项目)
    {
    Console.WriteLine(“{0}:{1}”,项,
    
    Regex.Replace(item,@)(?一个正则表达式,用于搜索
    \\\\\\?&\\\\\?
    并替换为
    \\\\&
    ,这是一种简单的方法。它在行的开始和结束以及行内工作


    表达式在
    &
    前后查找零个或一个
    字符,并替换所有四个变体(即
    &
    &
    &
    &
    )使用所需的文本。表达式不会试图在现有的
    |
    字符正确时保留这些字符。

    它可能会替换字符串的开头和结尾。谢谢,这正是我所需要的。请您解释一下它的工作原理。本页非常好地解释了查找方法:是否需要替换字符串开头/结尾处的(&A)如果没有,请使用捕获组:
    ([^ |]&([^ |]
    ,并替换为
    $1 |和|$2
    。如果您需要解释,我可以发布我的答案。如果您需要,请告诉我。但问题是“我和你”不应该更改,这会将其更改为“我和你”