1

Javaの正規表現にそのような問題があります。私はチャットアプリケーションをコーディングし、クライアントは「メッセージ」または「\コマンド値」だけをサーバーに送信できました。この文字列を解析したいのですが、行内のコマンドであるかどうかを確認します。ログインする場合は値が必要ですが、ログアウトする場合は value.required を false にする必要があります。私はそのような正規表現を作成します

"^\\\\(?<comm>login|status|((?=logout)))\\s(?<content>\\w+)"

ログアウト条件は何と書けばいいですか?通信グループでログアウトしたい。if logout のようなものを書く必要があります。その後に続くものは何も読まないでください。

4

2 に答える 2

2

おそらく、パラメーターをオプションにする方がよいでしょう:

^\\(?<command>login|status|logout)(?:\s(?<param>\w+))?

結果のロジックを Java でチェックします。

本当に正規表現を使用したい場合は、次のようにします。

^\\(?<command>login|status|logout(?=$))(?:\s(?<param>\w+))?$
于 2012-06-11T17:36:22.210 に答える
1

おそらく、特定のコマンドにパラメーターが必要かどうかを、正規表現ではなく汎用コード(つまり、Java)でチェックするでしょう。つまり、正規表現はトークン化には適していますが、解析にはあまり適していません。

ただし、そのようにする正当な理由がある場合は、式を2つの部分に分割します。1つはコマンドがコマンドを必要とする場合、もう1つはコマンドを必要としない場合です。例えば:

^\\(?:(?<command>login)\s+(?<param>\w+)|(?<command>status|logout)(?<param>))$

正規表現が正しく動作するためにfinalは厳密には必要ではないことに注意してください。これは、後続のコードが結果の2つの名前付きグループ( commandparam(?<param>))に依存できるようにするためだけにあります。

論理的には、これは3つのグループに拡張でき、3番目のグループにはオプションのパラメーターを持つコマンドが含まれます。

複数行の文字列にGroovy(またはJava 7)を使用している場合、これはより明確に次のように記述できます。

^\\(?x:
    (?<command>login) \s+ (?<param>\w+)   # Commands that require a parameter
    |                                     # -or-
    (?<command>status|logout) (?<param>)  # Commands that do not require a parameter
)$
于 2012-06-11T17:50:06.007 に答える