2015-10-28 94 views
0

我需要用'|'来包围所有'&'在一个字符串中,但只有当没有'|'有 例如。以下字符串( - >预期结果):c#正则表达式替换插入

  1. “我&你” - > “我| & |你”
  2. “我| &你” - >不改变
  3. “我& |您” - >不改变
  4. “我&你” - > “我| & |你”

我想通了选择(至少我认为)这将抓住例子1和4

[^|]&[^|] 

但现在我坚持创建替换模式。 我知道我需要在'&'之前和之后复制零件,但无法使其工作。最近的结果与

|&| 

而在此之前和“&”

注后也删除卡拉科特:我不能使用

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

为字符串已经可以包含“| | &“,并且不会产生预期结果。

任何正则表达式的替代方案也是值得欢迎的!

+1

您是否需要在字符串的开始/结束处替换&?有连续&?如果不是,则使用捕获组:'([^ |])&([^ |])'并替换为$ 1 |&| $ 2'。 –

+0

如果您需要解释,我可以发布我的答案。让我知道你是否需要这个。 –

回答

4

您需要使用负前瞻和回顾后:

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

它可能会取代在字符串的开头和结尾。 –

+0

谢谢,它做我需要的。你能解释它是如何工作的吗? – Vanice

+0

这个页面很好的解释了这个问题:http://www.regular-expressions.info/lookaround.html – aquinas

3

这应该给你的例子:

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(); 

} 
1

正则表达式搜索\|?&\|?|&|替代将是一个简单的方法。这可以在行的开始和结束以及行内进行。

表达找零个或一个|字符之前和之后&也和与所需的文本替换所有四种变化(即&|&|&|&|)。表达式不会尝试在现有的|字符正确时单独离开。

+0

但是这个问题说“我&你|”不应该被改变,这会改变它为“我|&|你” – aquinas