8

文字列を指定したユーザーを検証し、それが有効なセット、おそらく内部セットを含むセットであることを検証する必要があります。例:

 1) {1, 2, 3, 4} = valid
 2) {1, 2, {3, 4}, 5} = valid
 3) 1, 2, 3, 4 = invalid (missing brackets)
 4) {1, 2, {3, 4, 5} = invalid (missing inner bracket)

これは私が使用している正規表現です(読みやすさのために分割されています):

String elementSeparator = "(,\\s)?";
String validElement = "(\\{?[A-Za-z0-9]*\\}?" + elementSeparator + ")*";
String regex = "^\\{" + validElement + "\\}$";

現在、オプションの開閉ブラケット付きのセットを受け入れますが、両方が存在する場合にのみ受け入れる必要があり、内部セットにブラケットがない場合は受け入れません。私の現在の実装では、4番目の例が有効なセットとして受け入れられています。

どうすればこれを達成できますか?

4

3 に答える 3

4

ANTLR などの重いツールを使用せずにこの問題に対処する方法を示す Java 疑似コードを次に示します。基本的なアプローチは、入力をトークンに分割することです。

  1. 単一の左中括弧または右中括弧
  2. コンマ
  3. 空白
  4. 識別子

次に、トークンをスキャンしながら、ネスト レベルを追跡します。最後に到達したときにネスト レベルが 0 でない場合、入力文字列にはアンバランスなブレースが含まれています。

Pattern token = Pattern.compile("([{}]|,|[A-Aa-z0-9]+|\s+)");
int nesting = 0
Matcher m = token.matcher(inputString);
while(m.find())
{
    if (m.group(1).equals("{")
        nesting++;
    else if (m.group(1).equals("}")
    {
        nesting--;
        if (nesting < 0)
            error - too many right braces
    }
    else
        ....
}
if (nesting != 0) 
    log("incorrect nesting");

このフレームワークが整ったら、コンマが 2 つ並んでいるようなものを検出するように拡張できます。コンマが表示されたらフラグを設定し、識別子が表示されたらフラグをクリアします (空白は除く)。コンマと右中括弧の分岐では、フラグをテストし、その時点のコンマが無効であるため、エラー メッセージを発行します。など、必要な検証のために。

上記の疑似コードは完全な解決策ではなく、一般的なアプローチを提供することを目的としていることに注意してください。完全なソリューションは、無効な文字を処理する必要があり、レクサー (文字列をトークンに分割する部分) がより複雑になるため、多少複雑になります。

于 2012-10-31T18:55:17.793 に答える
3

一致する角かっこを使用しているため、単純な正規表現の文法では不十分です。文脈自由文法と呼ばれるものを調べる必要があります。ANTLRを調べることをお勧めしますが、必要と思われるよりもはるかに重いソリューションになります。

于 2012-10-31T18:48:20.980 に答える
0

簡単な方法は、最後の「{」を検索し、次に直後に続く「}」を検索することです。次に、その間のテキストが有効であることを確認します(コンマ区切りのリストである必要があります)。次に、文字列全体('{'から'}'までをダミー値(例:0)に置き換えます。次に、0が残るか、エラーが発生するまで繰り返します。

于 2012-10-31T19:01:15.667 に答える