代码之家  ›  专栏  ›  技术社区  ›  Srdjan M.

正则表达式if条件c#

  •  2
  • Srdjan M.  · 技术社区  · 8 年前

    txt文件中的文本:

    10 25
    32 44
    56 88
    102 127
    135 145
    ...
    

    如果是第一行,则将最后一个数字用作新行中的第一个。可以这样做吗?或者我需要在正则表达式解析后遍历行。

    0 10 25
    25 32 44
    44 56 88
    88 102 127
    127 135 145
    
    (?<Middle>\d+)\s(?<End>\d+) //(?<Start>...)
    
    3 回复  |  直到 8 年前
        1
  •  2
  •   Dale    8 年前

    出于可读性原因,我建议不要使用正则表达式,但这会起作用:

     var input = ReadFromFile();
     var regex = @"(?<num>\d*)[\n\r]+";
     var replace = "${num}\n${num} ";
     var output = Regex.Replace(input, regex, replace);
    

    除了第一个0外,这一切都将完成。

        2
  •  1
  •   Wiktor Stribiżew    8 年前

    注意,对于这样的任务,正则表达式方法听起来并不太好。它可以用于较小的输入字符串,对于较大的字符串,建议您编写更多的逻辑并逐行解析文本。

    因此,出于学术兴趣,这里有一个正则表达式解决方案,展示了如何根据匹配的行是否为第一行,使用不同的替换模式进行替换:

    var pat = @"(?m)(?:(\A)|^(?!\A))(.*\b\s+(\d+)\r?\n)";
    var s = "10 25\n32 44\n56 88\n102 127\n135 14510 25\n32 44\n56 88\n102 127\n135 145";
    var res = Regex.Replace(s, pat, m => m.Groups[1].Success ? 
            $"0 {m.Groups[2].Value}{m.Groups[3].Value} " : $"{m.Groups[2].Value}{m.Groups[3].Value} ");
    

    测试结果 C# demo :

    0 10 25
    25 32 44
    44 56 88
    88 102 127
    127 135 14510 25
    25 32 44
    44 56 88
    88 102 127
    127 135 145
    

    注意 \n 换行符是硬编码的,但它仍然只是正则表达式功能的一个示例。

    图案细节

    • (?m) -内联 RegexOptions.Multiline 修改器
    • (?:(\A)|^(?!\A)) -非捕获组匹配
      • (\A) -开始将字符串捕获到组1
      • | -或
      • ^(?!\A) -行的开头(但不是字符串,因为 (?!\A) 消极展望)
    • (.*\b\s+(\d+)\r?\n) -第2组:
      • .*\b -0+个字符,除换行符外,直到最后一个单词边界,后跟。。。
      • \s+ -1+空格(可以替换为 [\p{Zs}\t]+ 仅匹配水平空白)
      • (\d+)
      • \r?\n -CRLF或LF换行符。

    m.Groups[1].Success ? )替换为 0 第2组+第3组值+空间。否则,替换为第2组+第3组+空格。

        3
  •  0
  •   dovid    8 年前

    带C#。

    var lines = File.ReadLines(fileName);
    
    var st = new StringBuilder(); //or StreamWriter directly to disk ect.
    var last  = "0";
    foreach (var line in lines)
    {
        st.AppendLine(last + " " + line );
        last = line.Split().LastOrDefault();
    }
    
    var lines2 = st.ToString();