2

Javaを使用して、別の正規表現を解析する正規表現を作成しようとしています。ソースの正規表現から名前付きグループを抽出したい(これらはURLでスラッシュで区切られたパラメーターを表す)。また、ソース文字列はスラッシュで開始および終了しない場合があります。

たとえば、両方のソース文字列の場合:

(?<name>john)/(?<facet>aaa/bbb/ccc/?)

/(?<name>john)/(?<facet>aaa/bbb/ccc/?)/

それらを名前付きグループとして抽出する正規表現が欲しいのですが:

(?<name>john)(?<facet>aaa/bbb/ccc/?)

私は試した :

(^|.*/)(?<param>\(\?<[^>]+>[^\)]+\))(/.*|$)

(?<name>john)しかし、これは「param」という名前のグループとしてのみ返され、 (?<facet>aaa/bbb/ccc/?)!!ではありません。

パーツを外す(/.*|$)と両方が返ってきます!しかし、この終了条件で、パラメーターの後にスラッシュが続くか、行の終わりにあることを確認する必要があります...

なぜ(/.*|$)2番目のパラメータが見つからないのか分かりますか?

4

2 に答える 2

1

見回しはあなたの友達です:(?=\/|\n)

これがあなたが必要とするものの小さな例です。

于 2012-12-01T20:20:31.530 に答える
1

以下の正規表現を使用できます:-

"(?:/|^)(\\(\\?<.*?>.*?\\))(?=/|$)"

そして、Matcher@findメソッドを使用してすべての一致を抽出します。

String str = "(?<name>john)/***(?<facet>aaa/bbb/ccc/?)/(?<not>aaa/bbb/?)***";
Matcher matcher = Pattern.compile("(?:/|^)(\\(\\?<.*?>.*?\\))(?=/|$)").matcher(str);

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

出力:-

(?<name>john)

slash最後の1つは、その後にnorが続かないため、印刷されませんend of line

于 2012-12-01T20:21:00.533 に答える