0

フォームにパターンマッチングを実装したい

(a + b)(c-or * or / d)..............何度でも。

次のパターンを使用していますが、再帰的に機能していません。最初のグループを読んでいるだけです。

Pattern pattern;
String regex="(([0-9]*)([+,-,/,*])([0-9]*)*)";
pattern=Pattern.compile(regex);
Matcher match = pattern.matcher(userInput);
4

4 に答える 4

0

このような表現が必要になります

[0-9]+-[0-9]+[\/*-+][0-9]+[\/*-+][0-9]+[\/*-+][0-9]+[\/*-+][0-9]+

式全体を一致させる必要があります。パターンが繰り返されているため、式の一部を照合して2回目の検索を行うことはできません。

注:ルビーでは、\は/文字の例外シーケンスであるため、C#で省略したり、別の文字に置き換えたりすることができます。

デモ

于 2012-04-18T04:13:53.473 に答える
0

パターン

<!--
\((\d|[\+\-\/\\\*\^%!]+|(or|and) *)+\)

Options: ^ and $ match at line breaks

Match the character “(” literally «\(»
Match the regular expression below and capture its match into backreference number 1 «(\d|[\+\-\/\\\*\^%!]+|(or|and) *)+»
   Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
   Note: You repeated the capturing group itself.  The group will capture only the last iteration.  Put a capturing group around the repeated group to capture all iterations. «+»
   Match either the regular expression below (attempting the next alternative only if this one fails) «\d»
      Match a single digit 0..9 «\d»
   Or match regular expression number 2 below (attempting the next alternative only if this one fails) «[\+\-\/\\\*\^%!]+»
      Match a single character present in the list below «[\+\-\/\\\*\^%!]+»
         Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
         A + character «\+»
         A - character «\-»
         A / character «\/»
         A \ character «\\»
         A * character «\*»
         A ^ character «\^»
         One of the characters “%!” «%!»
   Or match regular expression number 3 below (the entire group fails if this one fails to match) «(or|and) *»
      Match the regular expression below and capture its match into backreference number 2 «(or|and)»
         Match either the regular expression below (attempting the next alternative only if this one fails) «or»
            Match the characters “or” literally «or»
         Or match regular expression number 2 below (the entire group fails if this one fails to match) «and»
            Match the characters “and” literally «and»
      Match the character “ ” literally « *»
         Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
Match the character “)” literally «\)»
-->

計算アルゴリズム
入力文字列の解析と処理には、スタックを使用する必要があります。コンセプトについてはこちらをご覧ください。

よろしく
Cylian

于 2012-04-18T05:35:07.510 に答える
0

その種のシーケンスに一致する必要がある正規表現は次のとおりです。

\ s *-?\ d +(?:\ s * [-+ / *] \ s *-?\ d +)+ \ s *

それを構成部品に分解しましょう!

\s*            # Optional space
-?             # Optional minus sign
\d+            # Mandatory digits
(?:            # Start sub-regex
   \s*         #    Optional space
   [-+*/]      #    Mandatory single arithmetic operator
   \s*         #    Optional space
   -?          #    Optional minus sign
   \d+         #    Mandatory digits
)+             # End sub-regex: want one or more matches of it
\s*            # Optional space

(スペースを一致させたくない場合は、それら\s*をすべて削除し、ユーザーをかなり驚かせることに注意してください。)

\ここで、上記をJavaで文字列リテラルとしてエンコードする場合(コンパイル前)、その中の各文字をエスケープするように注意する必要があります。

String regex="\\s*-?\\d+(?:\\s*[-+/*]\\s*-?\\d+)+\\s*";

もう1つ注意すべき点は、Javaが式評価ツリーを解析して構築するために、正規表現を細かく分割しないことです。(コードの残りの部分と一緒に)文字列全体と一致するかどうかだけです。(かっこをキャプチャしてもあまり役に立ちません。何らかの形の繰り返しの中に入れると、一致した文字列の最初の場所のみが報告されます。)これを適切に行う最も簡単な方法は、次のようなパーサジェネレータを使用することです。 Antlr(括弧で囲まれた部分式、演算子の優先順位の管理なども実行できます)

于 2012-04-18T05:58:15.563 に答える
-1

式は+、(、)のような特殊文字をエスケープしません

これを試して

/\(\d+[\+|-|\/|\*]\d+)\G?/

\Gはパターン全体です

?前のものはオプションであることを意味します

[0-9]*を\d+に変更しました。これはより正しいと思います

私はあなたを|に変更しました

于 2012-04-18T05:12:55.020 に答える