-1

これは私が扱っている文字列の例です

{Hi|Hello|Holla} {James{ey|o|ing}|Bob{bie|bey}}

{} の例の間の値を抽出するには、正規表現が必要です。

Hi|Hello|Holla
James{ey|o|ing}
Bob{bie|bey}

元の弦はスピンタックスと呼ばれています。私のプログラムは、各 {} ブロックに囲まれたランダムな値を選択します。ネストされた {} ブロックはかなり深くなる可能性があります。

正規表現は、ネストされた {} ブロックを無視して {} 間の値を抽出する必要があります。次に、ネストされた {} ブロック内のパイプが触れられないように、ネストされた {} ブロックを再び無視してパイプ (|) で値を分割します。

それは理にかなっていますか?

String メソッドを使用して部分的なソリューションを実装しましたが、パイプで分割すると、ネストされた {} 内のパイプも分割されます。これは予想されることですが、ネストされた {} を無視する方法がわかりません。

public String spintaxParse(String s)
    {
        // TODO: Implement logic to check for {} within String.
        if (s.Contains('{'))
        {
            int firstOccuranceOfOpenBrace = s.IndexOf('{');

            while (s[firstOccuranceOfOpenBrace + 1].Equals('{'))
                firstOccuranceOfOpenBrace++;

            int firstOccuranceOfClosingBrace = s.Substring(firstOccuranceOfOpenBrace).IndexOf('}');

            String spintaxBlock = s.Substring(firstOccuranceOfOpenBrace, firstOccuranceOfClosingBrace + 1);

            String[] items = spintaxBlock.Substring(1, spintaxBlock.Length - 2).Split('|');

            Random rand = new Random();

            s = s.Replace(spintaxBlock, items[rand.Next(items.Length)]);

            return spintaxParse(s);
        }
        else
        {
            return s;
        }
    }
4

2 に答える 2

1

マルチネストされた構文を扱っているので、「ANTLR」などのパーサー生成ツールを使用して単純なパーサーを作成することをお勧めします。 ANTLR リンク

ANTLR 構文は次のようになります。

statements: statement+
     ;
statement: '{'+ content + '}'
     ;
content: token
     | TOKEN + '|' + content
     | TOKEN + '|' + statement
     ;

TOKEN: \w+
     ;
于 2011-11-04T06:22:26.023 に答える
0

手で、またはパーサージェネレーターを使用して文字列を解析する方が簡単な場合があります。

バランスの取れた中かっこに一致する正規表現については、この回答をチェックしてください - String.Format-like utility の正規表現と関連する MSDN の記事http://msdn.microsoft.com/en-us/library/bs2twtah.aspx#balancing_group_definition

于 2011-11-04T06:22:09.950 に答える