0

私は正規表現にあまり詳しくなく、私を超えた問題に遭遇しました。文字列をトークン化し、最後から数えて任意のトークン以外のすべてを取得する式を考え出すのに助けが必要です。

P037-077たとえば、次の文字列からすべてを取得したいのですが

http://www.wayfair.com/George-Kovacs-by-Minka-Bling-Bling-1-Light-Wall-Sconce-P037-077-GKV1032.html

これを行う 1 つの方法は、区切り文字を「-」にしてトークンを逆方向に数え始め (文字列の必要な部分の左側にいくつのトークンがあるかという保証はありません)、2 番目と 3 番目のトークンを取得してから取得することです。それ以外のすべて。

-([^-]*-[^-]*)-[^-]*$This returnsである式の 90% をP037-077取得しましたが、その補数を取得する必要があります。

うまく説明できたかどうかわかりません。不明な点がありましたら再度ご説明いたします。

これは任意の言語でトークン化することで簡単に実行できることはわかっていますが、残念ながら、私が使用しているツールは正規表現のみを入力として受け取るため、それを行う自由はありません。Java 構文を使用します。

4

3 に答える 3

1

これは、区切り記号としてダッシュを使用する場合、2 番目と 3 番目の最後のトークンを削除します。

String cleaned = str.replaceAll("(-[^-]+){2}(?=-[^-]*$)", "");

ここにいくつかのテストコードがあります:

String str = "http://www.wayfair.com/George-Kovacs-by-Minka-Bling-Bling-1-Light-Wall-Sconce-P037-077-GKV1032.html";
String cleaned = str.replaceAll("(-[^-]+){2}(?=-[^-]*$)", "");
System.out.println(cleaned);

出力:

http://www.wayfair.com/George-Kovacs-by-Minka-Bling-Bling-1-Light-Wall-Sconce-GKV1032.html

于 2013-10-25T05:18:03.960 に答える
0

あなたが探しているのは「非捕獲グループ」です。グループは で囲まれたもの()です。すべてのグループがマッチングに使用され、結果にも含まれます。非キャプチャ グループは、囲まれたものです(?:)(最初の 3 文字は左中括弧として機能します)。非キャプチャ グループはマッチングに使用されますが、結果には含まれません。例:

^(match_me)(?:but_not_me)$

あなたが言うようにそれを適用する場合:

1: match_me
2: match_mebut_not_me

2 番目の部分が存在しないため、最初の文字列とは一致しません。ただし、2 番目の文字列には一致しますがbut_not_me、一致から除外されます。URL に関する例については、「非キャプチャ グループとは? 疑問符の後にコロン (?:) が続くとはどういう意味ですか? 」 を参照してください。

于 2013-10-25T08:14:24.840 に答える