-1

正規表現で何が問題になっているのかを理解するのに大きな問題があります。完了するために、いくつかの背景情報をレイアウトします。

このプログラムは、SIMPLESEMインタープリターを実装することになっています。ここで関係する文法は次のとおりです。

< Expr >    ==>   < Term > {( + | - ) < Term >}

< Term >    ==>   < Factor > {( * | / | % ) < Factor >}

< Factor >  ==>   < Number > | D[< Expr >] | (< Expr >)

< Number >  ==>   0 | (1..9){0..9}

の角括弧内の内容を表示するはずのこのコードが提供されました< Factor >が、機能しませんでした。

 Matcher m;

(m = Pattern.compile("D\\[(.*)").matcher(expr)).find();
        expr = parseExpr(m.group(1));
        (m = Pattern.compile("\\](.*)").matcher(expr)).find();
        expr = m.group(1);

入力例として、私はこれを持っています:

jumpt 5, D[0] == 0

ここ< Factor >で関係しているのはD[0]です。上記の関数は、残ったブラケットを処理しないフィードインするため、機能しません。また、機能しないはず0]です。parseExpr()だから私はそれを次のように切り替えました:

(m = Pattern.compile("D\\[(.*)").matcher(expr)).find();
        expr = m.group(1);
        (m = Pattern.compile("\\](.*)").matcher(expr)).find();
        expr = parseExpr(m.group(1));

しかし、これはマッチャー/正規表現のために機能しませんでした。空の文字列が出力されたと思います。だから私はこれを試しましたが、一致するものがないというエラーが表示されます:

(m = Pattern.compile("D\\[(.*)").matcher(expr)).find();
expr = m.group(1);

if(expr.contains("(.*)")) 
{
    (m = Pattern.compile("\\](.*)").matcher(expr)).find();
}
else
{
    (m = Pattern.compile("\\]").matcher(expr)).find();
}   
    expr = m.group(1);
    expr = parseExpr(expr);

最後から2番目の行で範囲外のインデックスを提供します。よろしくお願いします。

4

2 に答える 2

0

角かっこ内のデータが必要な場合、正規表現は次のようになります。

D\[([^\]]*)

これは基本的に「'D['を取り、それから']'ではないものをすべて取り、試合に保存する」と言っています。

Regexperをチェックして、正規表現を視覚化してください。

于 2013-01-27T21:18:50.483 に答える
0

この部分D[ <Expr> ]とがあり( <Expr> )、ブラケットのマッチングの問題が発生します。これは、再帰的な正規表現をサポートしていないため、Java正規表現で処理できるものではありません。

この場合、正規表現は字句解析にのみ役立ちます。言語に合わせてカスタムパーサーを作成する必要があります。

于 2013-01-27T21:20:16.500 に答える