正则表达式如果条件c#

时间:2017-10-17 20:51:22

标签: c# regex

来自txt文件的文字:

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

如果它是第一个行位置0,则在新行中使用最后一个数字作为第一个行。是否可以这样做,或者我需要在正则表达式解析后循环遍历行。

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

(?<Middle>\d+)\s(?<End>\d+) //(?<Start>...)

3 个答案:

答案 0 :(得分:2)

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

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

除了第一个0之外,它将完成所有事情。

答案 1 :(得分:1)

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

因此,更多来自学术兴趣,这里是一个正则表达式解决方案,显示如何根据匹配的行是否是第一个来替换不同的替换模式:

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+) - 第3组:一个或多个数字
    • \r?\n - CRLF或LF换行符。

替换逻辑位于匹配评估器内:如果组1匹配(m.Groups[1].Success ?),则替换为0,组2 +组3值+空格。否则,请替换为第2组+第3组+空格。

答案 2 :(得分:0)

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