1

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

HOME(SPADE0) HOME(HEART0) HOME(CLUB0) BOTTOMCOL(CLUBA) ON(HEART2 CLUBA)

に分けてみたいと思います

    HOME(SPADE0)
    HOME(HEART0)
    HOME(CLUB0)
    BOTTOMCOL(CLUBA)
    ON(HEART2 CLUBA)

スペースで分割すると、最後のトークンも分割されますが、これは望ましくありません。それに適した正規表現は何ですか?

前もって感謝します!

編集

  String[] tokens = line.split("[)]\\s+"); 
4

4 に答える 4

7

区切り文字の代わりにコンテンツを一致させて分割することをお勧めします。

final Matcher m = Pattern.compile("\\w+\\(.*?\\)").matcher(input);
final List<String> matches = new ArrayList<>();
while (m.find()) matches.add(m.group());
于 2012-11-08T21:29:40.203 に答える
3

この正規表現を試してください (を使用Negative look-ahead): -

String[] arr = str.split("\\s+(?![^(]*\\))");
System.out.println(Arrays.toString(arr));

(と の間ではないスペースでのみ分割されます)

出力: -

[HOME(SPADE0), HOME(HEART0), HOME(CLUB0), BOTTOMCOL(CLUBA), ON(HEART2 CLUBA)]

説明: -

\\s+             // split on space (one or more)

   (?!           // Negative look ahead (Not followed by)
      [^(]*      // Anything except `(` (0 or more)
      \\)        // Ending with `)`
    )            // End     

したがって、スペースが と の間にある場合は のように(なり)ます(HEllo World)

上記の正規表現には一致しません。そこのスペースの後には次のものが続くため: -

[^(]*  // Any string not containing `(` - World

\\)   // Ending with `)`

ただし、これで問題が解決することに注意してくださいsplit。しかし、理想的には、これは と で行う必要がPatternありMatcherます。@Markoの答えのように。

于 2012-11-08T21:29:18.197 に答える
1

これはうまくいくはずです:

Pattern ptrn = Pattern.compile("\\w+\\(.+?\\)");
于 2012-11-08T21:52:14.893 に答える
0

「)」で分割して、見つかったすべてのトークンに追加してみませんか?

String [] results = str.split( ")" );

String token1 = results[0].trim() + ")"; // the trim is to remove leading spaces 

これは、すべてのデータが提示された形式と一致することを前提としています。

于 2012-11-08T22:01:26.287 に答える