3

22 + 4 * 3 / 4 のような文字列があります

次に、この文字列からトークンを抽出する必要があります。これが私の1行のコードです:

String[] tokens  = str.split( [ +-*/]+ )

基本的に私の区切り文字列は [+-*/] 記号で分割したいので + - * /

しかし、残念ながら、これは * の正規表現バージョンと競合します。 / にバックスラッシュを追加しようとしました。

Java を *, / 文字通りの意味でコンパイルするにはどうすればよいですか? パターンに関するJavaドキュメントに従って行ったと思いましたhttp://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#sum

私はここで何を逃したのですか?

ありがとう

4

3 に答える 3

3

実際、文字クラスで使用する*+、その特別な意味が失われます (結局、文字クラスでは意味がありません)。したがって、これらの文字をエスケープする必要はありません。逆に、文字クラスで- のみ特別な意味を持ちますが、範囲を示す文字間で使用される場合に限ります。最初や最後に使用しても特に意味はありません。したがって、次のようになります。

[ +*/-]+

正規表現の視覚化

Debuggex デモ

于 2013-10-03T23:59:58.050 に答える
2

文字クラス では、[...] -のような文字の範囲を作成するために使用される特殊文字ですa-z。それをリテラルにするには、クラス文字の先頭、クラス文字[-...]の末尾に配置[...-]するか、単にエスケープする必要があります。\これを Java では として記述する必要があります"\\-"。この方法を試してください

String[] tokens  = str.split("[ +\\-*/]+");
于 2013-10-03T23:59:44.347 に答える
0

文字列を解析しようとしていますか? 私の推測では、入力ストリームの字句解析 (スキャン) を実行しようとしているのでしょう。

  • strtok と文字の先読み/プッシュバックを構築することで、スキャナーを手動でロールすることができます。
  • take のような lex や flex を使用して字句スキャナーを構築できます。
  • 貧弱なパーサーの一連の正規表現とケースステートメントを使用できます

代数文字列をトークン化したいとします。文法と認識したいトークンを定義する必要があります。BNF (Backus-Naur Formalism) のようなものが必要です。または、「鉄道構文図」を使用することもできます (個人的には BNF を好みますが、鉄道図が好きな人もいます)。

これが始まりです:

expression --> sexpr | nil
parenexpr  --> '(' sexpr ')'
sexpr   --> parenexpr | addexpr | thing | nil
addexpr --> mulexpr addop mulexpr | mulexpr
mulexpr --> parenexpr
thing   --> symbol | integer | real | scientific
integer --> { '+' | '-' }? digit+
real    --> { '+' | '-' }? digit+ { . digit+ }?
scientific --> { + | - }? digit+ { . digit+ } e { '+' | '-' }? digit+
addop   --> '+' | '-'
mulop   --> '/' | '*' | '^' | '%'
relop   --> '||' | '&&' | '!'
symbol  --> { character | '_' } { character | '_' | digit }*
digit   --> [0-9]
character --> [A-Za-z]
//etc

これが意味することは、文法生成記号 (-->) の左側にある各項目は、右側にあるものの 1 つに展開されるということです。この定義は再帰的であることに注意してください。これにより、必要なプログラミングの種類がわかります。とにかく、各トークンをスキャンして識別し、整数、実数、科学、シンボル、addop、mulop、relop、および抽出するその他のトークンを収集する必要があります。途中で、空白 (タブ、スペース、改行) およびその他の未定義の記号を処理する方法を決定する必要があります。

于 2013-10-04T00:44:15.860 に答える