2017-10-17 7 views
2

テキスト:正規表現であれば条件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

Regexは私がこれに使う最後のツールです。 – Amy

+1

@Amy、私は利用可能な最後のツールを使用した後にRegexを使用します... – taquion

答えて

1

正規表現のアプローチは、このようなタスクにはあまり適していないことに注意してください。それは小さな入力文字列に使用することができます。大きな文字列の場合は、さらに論理を書き、1行ずつテキストをパースすることをお勧めします。 C# demo

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} "); 

結果:

ので、学術的な興味からより、ここにマッチした行が最初であるか否かに基づいて異なる交換用のパターンで置換する方法を示す正規表現のソリューションです

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改行はハードコードされていますが、これはまだ正規表現の機能の一例です。インラインRegexOptions.Multiline修飾子

  • (?:(\A)|^(?!\A)) - -
    • (\A)のいずれかに一致する非捕捉グループ - グループ1
    • にそれを捕捉する文字列の先頭

      パターンは

      • (?m)詳細を|-または
      • ^(?!\A) - ラインの開始(ただし、原因(?!\A)否定先読みにない文字列)
    • (.*\b\s+(\d+)\r?\n) - グループ2:
      • .*\b - 0+の最後のワード境界に改行まで以外の文字(のみ一致水平空白に[\p{Zs}\t]+と置き換えてもよい)
      • (\d+) 1+空白 - - ラインは
      • \s+ ...と続くグループ3:一つ以上のDIGその
      • \r?\n - CRLFまたはLF改行。

    置換論理は、一致エバリュエータ内にある:グループ1 0及びグループ2 +グループ3つの値+スペースに置き換える(m.Groups[1].Success ?)一致した場合。そうでなければ、グループ2 +グループ3 +スペースに置き換えます。

  • 2

    私は読みやすさの理由のために正規表現を使用しないことを助言するだろうが、これは動作します:

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

    のC#で

    0

    最初の0から離れて全力を尽くします。