2

私はそのような文字列を持っています:obj[attr1=val1 attr2=val2 attr3=val3]
オブジェクト名と属性を抽出する必要があります。

以前、次の正規表現を使用して JavaScript で同様のタスクを決定しました。

/^(\w+)(?:\[(\w+=\w+)(?:\s(\w+=\w+))*\])?$/

今、私はJavaで決めるのに苦労しています:

Pattern pathPattern = Pattern.compile("^(\\w+)(?:\\[(\\w+=\\w+)(?:\\s+(\\w+=\\w+))*\\])?$");

オブジェクト名と最初の属性だけを取得しています。Mather クラスは、記号 "*" を考慮せずに "()" のカウントに対応するグループ カウントを取得しているようです。

js regexp のように Java reg exp を動作させる可能性はありますか、それとも 2 段階の抽出を行う必要がありますか?

ありがとうございました

4

1 に答える 1

4

Matcher.groupCount()は開き括弧の数だけを数え、それらをグループと見なします。したがって、開いたブラケットの数は、グループ カウントの数になります (非キャプチャ グループを使用していない場合)。

以下のパターンを使用して、内部の値を取得できます[.*]: -

Pattern pattern = Pattern.compile("(?:\\b)(\\w+?)=(\\w+?)(?:\\b)");
Matcher matcher = pattern.matcher(str);

while (matcher.find()) {
    System.out.println(matcher.group(1) + " : " + matcher.group(2));
}

これは、 andattr=val内のすべてのペアに一致します。[]

出力: -

attr1 : val1
attr2 : val2
attr3 : val3

更新: -

上記の文字列で境界チェックを行う必要がないため、上記のパターンは次のように単純化することもできます。

Pattern pattern = Pattern.compile("(\\w+?)=(\\w+)");
于 2012-10-23T06:44:36.643 に答える