2009-07-02 12 views
0

最後に正規表現を使用しなければならないので、しばらくお待ちください。何かを達成するために急いでいますので、この簡単な質問にすばやく答えることができれば幸いです。Regexは複数の段落(.Net)の間で置き換えます。

は、私は次のテキストを持っていると言う:

Start 
A 
B 
C 
End  
Start 
A 
B 
C 
End Start 
A 
B 
C 
End 
Foo 
A 
B 
C 
Bar 

私はラインがパイプで破るだけ「スタート」と「終了」の言葉私の最終的な結果になるようにとの間で交換したいと思います:

Start|A|B|C|End  
Start|A|B|C|End Start|A|B|C|End 
Foo 
A 
B 
C 
Bar 

ありがとうございました。

答えて

5

このような式の解析を開始すると、正規表現の領域にはなりません。 XMLと同様に、同じ文字をコンテキストに基づいて別々に扱う必要がある式は、正規表現よりも高い言語クラスです。

ストリングを直接突き刺すという従来のアプローチは、この状況ではさらに効果的です。あなたの例を示したように、元の文字列が空白で分割されると仮定すると、

は、あなただけの空白で文字列を分割し、あなたがトークンの代わりに、改行の間にパイプを入れてStartEndトークンの間にある時にフラグを設定することができます。

+0

これは元の質問に答えますが、私は私の例をより具体的にすべきでした。現実には、2つの単語の間にのみアドホック正規表現を適用する必要があります。実際には、 "End"と "Start"の間に2つの改行がないかもしれません。 "End"と "Start"の間には何かがあります。 – Rene

+0

mmmm ...私は何をすればいいのかわからないので、私はこの答えを(それ以来)正しかったとマークし、私の質問のための正しい情報で新しい質問を開くべきですか?または、私は元の投稿を編集し、正しい回答ではないと考えてください(実際には一点で正しい答えでした)。 – Rene

+0

私は正しい答えとしてマークし、別の質問をするべきだと思います。 – SolutionYogi

1

正規表現:

(Start)[\n]*(A)[\n]*(B)[\n]*(C)[\n]*(End) 

はと交換してください:

$1|$2|$3|$4|$5 

あなたがスタート、エンド、A、Bのためのregexでも、独自の値に入れたりすることができ、そして一部でC.ザ・交換することができますあなたの言語/正規表現エンジンに応じて少し違います、あなたが何を使っているか教えてくれれば、私はより具体的になります。

+0

これは、開始点と終了点の間に予測可能で一定した数の項目がある限り有効です。 – Welbog

+0

これは本当に正規表現のための良いアプリケーションではないことを私は容易に認めます。任意の数の項目に対してこれを行う方法はおそらくありますが、それは正規表現の限界に確実に達しています。 –

1

これは、あなたが提供した場合に有効です。それは何かもっと複雑に働くという保証はありません。

class Program 
{ 
    static void Main(string[] args) 
    { 
     string s = "Start" + Environment.NewLine + 
        "A" + Environment.NewLine + 
        "B" + Environment.NewLine + 
        "C" + Environment.NewLine + 
        "End" + Environment.NewLine + 
        "Start" + Environment.NewLine + 
        "A" + Environment.NewLine + 
        "B" + Environment.NewLine + 
        "C" + Environment.NewLine + 
        "End Start" + Environment.NewLine + 
        "A" + Environment.NewLine + 
        "B" + Environment.NewLine + 
        "C" + Environment.NewLine + 
        "End" + Environment.NewLine + 
        "Foo" + Environment.NewLine + 
        "A" + Environment.NewLine + 
        "B" + Environment.NewLine + 
        "C" + Environment.NewLine + 
        "Bar"; 

     Regex regex = new Regex(@"Start(\r\n[^\r\n(End)]*)*End", RegexOptions.Multiline); 
     string replaced = regex.Replace(s, AddPipes); 
     Console.WriteLine(replaced); 
     Console.ReadLine(); 
    } 

    static string AddPipes(Match m) 
    { 
     string x = m.ToString(); 
     return x.Replace("\r\n", "|"); 
    } 
} 
0

私はWelbogに同意します。この状況では、正規表現をあまりにも多く求めていると思います。 2パスのアプローチをお勧めします。 RegexBuddyによると、次のように私はあなたのテキストに一致する段落を引き出すために、上記の正規表現を使用して、クロムを交換する機能を交換するシンプルな正規表現または文字列を使用することになり

(Start)(\r\n)((.*)\2)+?(End) 

arbitary長さのターゲット段落と一致しますLfはパイプへのcharです。

関連する問題