0

基本的に、複数行のテキストボックスで次のパターンを見つけようとしています:

[p]なんでもかんでもなんでもいい[/p]

1.) パターンはテキスト ボックス内で n 回発生する可能性があり、n 回検出されることも必要です。

2.) [p] と [/p] の間には、空白と改行を含む任意の文字を使用できます (C# では「\r\n」)

3.) [p] と [/p] を含むパターン全体が欲しい

次のコードは、私の望んでいた結果に非常に近いものです。問題は、[p] と [/p] の間に複数の改行が発生する可能性があることです。私は多くの多くのソリューションを試しました。何もうまくいきませんでした。

private void getTextFromTag2(String Tag, String txt)
{
    txt = txt.Replace("\r", "");

    string re1 = "(\\[";    
    string re2 = "p";   
    string re3 = "\\]"; 
    string re4 = ".*";  // Here lies the problem
    string re5 = "";    // Left open for a solution => \r\n cann occur n-times
    string re6 = "\\["; 
    string re7 = "\\/"; 
    string re8 = "p";   
    string re9 = "\\])";    

    Regex r = new Regex(re1 + re2 + re3 + re4 + re5 + re6 + re7 + re8 + re9, RegexOptions.IgnoreCase | RegexOptions.Multiline);

    MatchCollection mc = r.Matches(txt, 0);

    foreach (Match match in mc)
    {
        String c1 = match.Groups[1].ToString();
        Console.Write(c1 + "\r\n");
    }

}

ご覧のとおり、.NET の RegEx エンジンは改行文字として "\n" のみを必要とするように思われるため、txt で "\r" を "" に置き換えました。

私のコードの問題は、re4 と re5 にあると思います。re4 は、改行がない限り、任意の文字を検出し、適切に機能します。

re4 は「空白と \n を含む任意の文字」と言うべきだと思います。しかし、私は本当にそれを理解していません。

繰り返しになりますが、パターンがテキストボックスで何度も発生する場合でも、エバーティングは正常に機能します。問題は、[p] と [/p] の間に改行が発生した場合です。

これはうまくいかない例です

[p]BlaBla BlaBla \r\n
BlaBla BlaBla \r\n
\r\n
BlaBla
[/p]

これは動作する例です

[p]BlaBla BlaBla[/p]
\r\n
\r\n
[p]Even more BlaBla[/p]
\r\n
\r\n
[p]Much more BlaBla[/p]

私の英語を許してください。私は英語のネイティブスピーカーではありません。

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

これはコードで、今は私のために働いています。変更されたものは //Changed Tagged です

private void getTextFromTag2(String Tag, String txt)
    {
        //txt = txt.Replace("\r", ""); //Changed

        string re1 = "(\\[";     
        string re2 = "p";    
        string re3 = "\\]";  
        string re4 = ".*";   
        string re5 = "?";   // Changed
        string re6 = "\\["; 
        string re7 = "\\/"; 
        string re8 = "p";   
        string re9 = "\\])";    

        Regex r = new Regex(re1 + re2 + re3 + re4 + re5 + re6 + re7 + re8 + re9, RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline); //Changed

        MatchCollection mc = r.Matches(txt, 0);

        foreach (Match match in mc)
        {
            String c1 = match.Groups[1].ToString();
            Console.Write(c1 + "\r\n");
        }

    }

どうもありがとう。

4

2 に答える 2

0

.改行を除くすべての文字に一致します。\s空白と改行に一致します。

(.|\s)*
于 2012-09-13T01:18:34.503 に答える
0

Singleline オプションを指定する必要があります

シングルライン モードを指定します。ドット (.) の意味を変更して、(\n を除くすべての文字ではなく) すべての文字に一致するようにします。

基本的に、他の言語でおなじみの "Dot-matches-all" オプションです。設定した複数行オプションは、行の最初と最後を一致させる動作にのみ影響します。詳細については、 RegexOption クラスを参照してください。

Regex r = new Regex(regex, RegexOptions.IgnoreCase | RegexOptions.Singleline);

あなたが提供した正規表現のもう1つの問題は、*貪欲です。[p][/p][p][/p] は単一の一致になります (最初の [p] と最後の [/p] で一致しました。re5 を次のように変更します。

string re5 = "?";    // Non-greedy match on *

これを修正して、2 つの別個の一致を取得します。

于 2012-09-13T01:15:40.887 に答える