【问题标题】:Replacing only single "\n" in string occurrence仅替换字符串出现中的单个“\ n”
【发布时间】:2018-12-21 14:27:44
【问题描述】:

我在 C# 中有一个字符串,它可以有多个 \n 字符。例如:

string tp = "Hello\nWorld \n\n\n !!";

如果\n 出现一次,我想用一些东西替换它,但如果多个\n 一起出现在同一个地方,我想不理会它们。所以对于上面的tp 字符串,我想替换HelloWorld 之间的\n,因为那个地方只有一个,而让三个\n 单独靠近字符串的末尾,因为他们出现在一个组中。

如果我尝试在 C# 中使用 Replace() 方法,它会替换所有这些方法。我该如何解决这个问题?

【问题讨论】:

  • 哪次出现的\n需要替换?
  • 请阅读How to Ask并尝试搜索。
  • 重新打开。这不是所选答案的重复。这不是关于“第一次”出现,而是关于出现在一个群体中。编辑问题以使其更清晰。
  • @JoelCoehoorn 我同意,我认为应该允许这样做
  • 要真正解决这个问题...我通常会为此使用 RegEx,但我不确定 .Net 正则表达式引擎中的 \n 字符是什么样的,所以我会将完整的代码答案留给其他人。

标签: c# string


【解决方案1】:

您可以尝试使用正则表达式:让我们将\n 更改为"*",只要\n 是单身:

using System.Text.RegularExpressions;

... 

string tp = "Hello\nWorld \n\n\n !!";

// "Hello*World \n\n\n !!";
string result = Regex.Replace(tp, "\n+", match => 
  match.Value.Length > 1 
    ? match.Value // multiple (>1) \n in row: leave intact
    : "*");       // single ocurrence: change into "*"

【讨论】:

    【解决方案2】:

    使用循环的解决方案:

    char[] c = "\t"+ tp + "\t".ToCharArray();
    for(int i = 1; i < c.Length - 1; i++)
      if(c[i] == '\n' && c[i-1] != '\n' && c[i+1] != '\n')
        c[i] = 'x';
    tp = new string(c, 1, c.Length-2);
    

    【讨论】:

      【解决方案3】:

      使用正则表达式并结合negative lookbehind and lookahead:

       var test = "foo\nbar...foo\n\nbar\n\n\nfoo\r\nbar";
       var replaced = System.Text.RegularExpressions.Regex.Replace(test, "(?<!\n)\n(?!\n)", "_");
       // only first and last \n have been replaced
      

      在搜索输入时,正则表达式“停止”在任何"\n" 处,它会查找并验证是否没有"\n" 是当前位置后面或前面的一个字符。 因此只会替换单个"\n"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-23
        • 2016-05-07
        • 2014-10-27
        • 2017-07-01
        • 1970-01-01
        • 2018-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多