来自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>...)
答案 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();