1

私はこのような文字列を持っています

String = "Förpackning Flaska (375 ml) Förslutning Skruvkapsyl Kr/lit (104,00) Pris 39,00 kr Antal i butik 30 st Hyllplats 04-11-01 Förpackning Flaska (750 ml) Förslutning Plastkork/syntetkork Kr/lit (100,00) Pris 75,00 kr Antal i butik 16 st Hyllplats 02-03-01";

この文字列内のテキストの一部を抽出したいと思います。私が望む最終結果はこれです:

「Förpackning Flaska (375 ml) Antal i butik 30 st Förpackning Flaska (750 ml) Antal i butik 16 st」.

次のコードを使用できます。

    name = name.replace(name.substring(name.indexOf(") ") + 2, name.indexOf("Antal")), "");
    name = name.replace(name.substring(name.indexOf("st ") + 2, name.lastIndexOf("")), "");

それは私にこの結果を与えるでしょう:

「Förpackning Flaska (375 ml) Antal i butik 30 st」

それは基本的に私がやりたいことをしますが、パターンの最初の発生後に停止します。

正規表現パターンを使用しようとしましたが、機能しません。文字列を観察して、") " と "Antal" の間のすべてに一致する正規表現パターンが必要であると結論付けました。他の混乱も取り除く必要がありますが、それは簡単です。私の問題は、正規表現を機能させることができないように見えることです。これはおそらく、このようなことを行うための最良の方法です。正規表現で括弧をリテラル文字にするために括弧をエスケープする必要があることは知っていますが、それを機能させることはできません。

これは私が思いついて試した正規表現です:

    Pattern p = Pattern.compile("\b\\) (.+?)\bAntal");
    Matcher m = p.matcher(name);
    m.find();
    System.out.println(m.group(1));

どんな助けやアイデアも大歓迎です!

4

3 に答える 3

2

あなたはおそらくJavaの文字列のreplaceAllメソッドを探しています。次の署名があります

public String replaceAll(String regex, String replacement);

これは、名前が示すように、正規表現の出現のすべてのインスタンスを置換テキストで置き換えます。

于 2012-06-18T17:40:24.287 に答える
2

1行でできる!

削除したいようです:

  • 単語の次の 2 つの単語"st"、および
  • ")"との間のすべて"Antal"

これを行うコードは次のとおりです。

input.replaceAll("((?<= st)( [^ ]+){2}|(?<=\\)).*?(?= Antal))", "");

正規表現に関する注意:

  • 単語境界を としてコーディングしていることに気付きました"\b"。これは間違いです。リテラル バックスペースを cd しました。代わりに、次のようにコーディングします。"\\b"
  • 正規表現 OR 式を使用して(A|B)、1 つの正規表現で両方を一致させました
  • 両方の正規表現は、後読みを使用して置換テキストを空白にします。これは、保持したい入力の一致する部分を元に戻すよりもクリーンです。つまり、両方の正規表現を 1 つの OR 式に結合できます。
  • ?inは重要です。これは、".*?"貪欲でない一致を意味します。それがないと、最初の括弧と最後の に一致し、その間AntalをスキップしますAntal

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

public static void main(String[] args) {
    String input = "Förpackning Flaska (375 ml) Förslutning Skruvkapsyl Kr/lit (104,00) Pris 39,00 kr Antal i butik 30 st Hyllplats 04-11-01 Förpackning Flaska (750 ml) Förslutning Plastkork/syntetkork Kr/lit (100,00) Pris 75,00 kr Antal i butik 16 st Hyllplats 02-03-01";
    String clean = input.replaceAll("((?<= st)( [^ ]+){2}|(?<=\\)).*?(?= Antal))", "");
    System.out.println(clean);
}

出力:

Förpackning Flaska (375 ml) Antal i butik 30 st Förpackning Flaska (750 ml) Antal i butik 16 st
于 2012-06-18T18:03:02.547 に答える
0

これを試してみてください。すべての文字列で機能するかどうかはわかりません。説明の最大長をおおよそ知る必要があります。

String s = "Förpackning Flaska (375 ml) Förslutning Skruvkapsyl Kr/lit (104,00) Pris 39,00 kr Antal i butik 30 st Hyllplats 04-11-01 Förpackning Flaska (750 ml) Förslutning Plastkork/syntetkork Kr/lit (100,00) Pris 75,00 kr Antal i butik 16 st Hyllplats 02-03-01";

String out = "";
Matcher mat = Pattern.compile("(Förpackning .{0,50}\\))|(Antal.{0,50}st)").matcher(s);
while(mat.find())
    out += mat.group()+" ";
System.out.println(out);
于 2012-06-18T18:03:33.713 に答える