-2

このようなコマンドに一致するものを取得しようとしています。

[AUTR| <version_software> | <version_protocol> | <msg> ]
[PING]

最初のコマンドでこれに一致するものを見つける正規表現は何ですか?

AUTR
version_software
version_protocol
msg

これはそれを解析するコードです:

String[] tokens =  msg.replace('<',' ').replace('>',' ').replace('[', ' ').replace(']', ' ').split("\\|");
for (int i=0; i<tokens.length; i++) tokens[i] = tokens[i].trim();

正規表現ソリューションでどのようにできるのか疑問に思っているだけです。

編集:

グループをより簡単な式で一致させようとしていますが、このコードでは m.groupCount への呼び出しで 1 が返されます... しかし、それを印刷しようとすると... この例外 "java.lang.IllegalStateException: 一致が見つかりませんでした" がスローされます"

    Pattern pattern = Pattern.compile("([\\w+])");
    Matcher m = pattern.matcher("[AUTR]");

    for (int i=0; i<m.groupCount();i++)
    {
        System.out.println(m.group(i));
    } 
4

1 に答える 1

0

編集: http://fiddle.re/6ykc

正規表現:

\[([\w]+)(\s*\|\s*<([\w. ]+)>\s*)*\]

Java 正規表現文字列:

"\\[([\\w]+)(\\s*\\|\\s*<([\\w. ]+)>\\s*)*\\]"

これは変数コマンド用であり、すべての追加パラメータは次の文字セット [a-zA-Z_0-9. ] (ピリオドとスペースを含む)。

問題:可変長コマンドには、可変タイプのグループ化で複数のグループをキャプチャできないという問題があります。

グループに関連付けられたキャプチャされた入力は、常にグループが最後に一致したサブシーケンスです。定量化のためにグループが 2 度目に評価される場合、以前に取得された値があれば、2 度目の評価が失敗しても保持されます。たとえば、文字列「aba」を式 (a(b)?)+ と照合すると、グループ 2 は「b」に設定されたままになります。キャプチャされたすべての入力は、各一致の開始時に破棄されます。 http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#cg

編集2:

それらすべてを取得するには、コマンドを取得するための 2 つの正規表現を実行できます。

String command_regex = "\\[([\\w]+)";

それを見つけて、 <> をキー文字として使用して選択できるパラメーターを見つけます。

String parameters = "<([\\w. ]+)>";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string_to_match);

while (matcher.find()) {
    System.out.println(matcher.group());
}

それが役立つことを願っています。


オリジナル:

フォーマットについて正確にはわかりませんが、「<」と「>」と「|」です 必要?また、コマンド、version_software、version_protocol、およびメッセージの形式は何ですか? これは正規表現に対する私の試みです(Pythonでテスト済み)

\[(\w+)\s*\|\s*<([\w.]+)>\s*\|\s*<(\w+)>\s*\|\s*<([\w\s]+)>\s*\]

かっことパイプ記号を必ずエスケープする必要があります (スペースがあるかどうかわからないため、間に \s* 条件を追加しました。そうする場合:

>> search.re("expression above", line) 
>> search.groups()

少なくとも Python のすべてのトークンを提供する必要があります。取得したい各トークンを調整できるように、よりハードコーディングしたままにしました。それ以外の場合は、最後の 3 つの部分をグループにして 3 回繰り返すように言って減らすことができます。結果教えて?

于 2012-06-12T17:32:04.620 に答える