2017-10-17 41 views
2
從txt文件

文字:正則表達式,如果條件c#

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>...) 
+1

即使有可能,爲什麼你想用這個正則表達式,不會結束了一個接近不可讀的函數? – Dale

+1

正則表達式是我爲此使用的最後一個工具。 – Amy

+1

@Amy,在使用我的最後一個工具之後,我會使用Regex ... – taquion

回答

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個值+空間取代。否則,請以Group 2 + Group 3 +空格替換。

2

我建議不要使用可讀性原因正則表達式,但是這將工作:

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

這將盡一切除了第一0

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