1

Java でネストされた式のマッチングを行いたいシナリオがあります。

次の式を検討してください。

SUM_ALL(2:3,4:5)>20

whereSUM_ALLは、アプリケーションで予約された演算子の意味を持ちます。ここで、指定された式から演算子名とその引数を抽出したいと考えています。同じことを行うために、パターン式を次のように定義しました。

Pattern testPattern = Pattern.compile("[^a-zA-Z]*([a-zA-Z_]+)\\s*\\(\\s*([0-9:,]+)\\s*\\).*");

式が単純に上記に限定されている場合、これはうまく機能します。同じ出力は次のとおりです。

Group 1: SUM_ALL
Group 2: 2:3,4:5

さて、与えられた式の中で、そのような演算子がいくつ存在するかを私は認識していないかもしれません。たとえば、次のケースを考えてみましょう。

SUM_ALL(4:5,6:7)>MAX(2:3,4:4)+MIN(3:4,5:7)

ここで、上記の各演算子とそれぞれの引数を抽出して、予約された意味に従って計算を実行し、簡単な数式を評価します。

Java パターン マッチャーにネスト機能があれば、演算子が解決されたら残りの式を考慮して、演算子を 1 つずつ抽出するのに役立ちます。残りの式を別のグループにキャプチャしてから、そのグループ値に対してマッチャーを実行し、式の最後に到達するまでそれを続けることでそれが可能であることは知っていますが、パターンマッチャーには、同じ固有の機能があります。

4

2 に答える 2

1

さて、これを持ってください:

(?:(SUM_ALL|MAX|MIN|addmorehere)\\(((?:\d+:\d+,?){2})\\)[+-><*/addmorehere]?)+

Javaやその他の言語用に実際にスケープされているわけではありませんが、アイデアは得られます

于 2012-10-25T11:09:29.440 に答える
1

次のようなコードを使用できます。

String str = "SUM_ALL(4:5,6:7)>MAX(2:3,4:4)+MIN(3:4,5:7)";
Matcher m = 
    Pattern.compile("(?i).*?([a-z_]+)\\s*\\(\\s*([\\d:,]+)\\s*\\)").matcher(str);
while (m.find())
   System.out.printf("%s :: %s%n", m.group(1), m.group(2));

出力:

SUM_ALL :: 4:5,6:7
MAX :: 2:3,4:4
MIN :: 3:4,5:7
于 2012-10-25T11:12:52.510 に答える