1

次の形式の文字列があります。

String name = "A|DescA+B|DescB+C|DescC+...X|DescX+"

したがって、繰り返しパターンは?|?+であり、いくつになるかわかりません。抽出したい部分は|...の前の部分です。したがって、私の例では、以下を含むリスト(たとえば、ArrayList)を抽出したいと思います。

[A, B, C, ... X]

私は次のパターンを試しました:

(.+)\\|.*\\+

しかし、それは私が望むようには機能しませんか?助言がありますか?

4

4 に答える 4

3

これをリストに変換するには、次のようにします。

String name = "A|DescA+B|DescB+C|DescC+X|DescX+";
Matcher m = Pattern.compile("([^|]+)\\|.*?\\+").matcher(name);
List<String> matches = new ArrayList<String>();
while (m.find()) {
    matches.add(m.group(1));
}

これにより、リストが得られます。

[A, B, C, X]

真ん中にあることに注意してください。これ?は、正規表現の2番目の部分が文字列全体を消費するのを防ぎます。これは、貪欲ではなく* 怠惰になるためです。

于 2012-07-22T09:08:26.263 に答える
1

あなたは任意の文字(.)を消費しており、|それを含むと、パーサーはすべてをつぶし続け、文字の取得が完了すると、を探しますが|、何も残っていません。

したがって、任意の文字と一致させてみてください。ただし、 |次のようになります。

"([^|]+)\\|.*\\+"

そして、それが収まる場合は、すべてを確認してください-| を使用して文字列の先頭にあり、文字列^の末尾に+があります$

"^([^|]+)\\|.*\\+$"

更新:Tim Pietzckerは良い点を述べています:あなたが見つけるまですでに一致しているので|、文字列の残りの部分も同様に一致させてそれで済ますことができます:

"^([^|]+).*\\+$"

UPDATE2:ちなみに、文字列の最初の部分を単純に取得したい場合は、次のようにして単純化できます。

myString.split("\\|")[0]
于 2012-07-22T08:56:30.630 に答える
1

別のアイデア:(+または文字列の先頭)と|:の間のすべての文字を検索します

List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("(?<=^|[+])[^|]+");
Matcher regexMatcher = regex.matcher(subjectString);
    while (regexMatcher.find()) {
        matchList.add(regexMatcher.group());
    } 
于 2012-07-22T09:12:44.960 に答える
0

最も簡単な解決策は、で分割し\\+、各部分に(.+?)\\|.*パターンを適用して必要なグループを抽出することだと思います。

于 2012-07-22T09:11:35.133 に答える