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。但理想情况下,这应该使用Patternand来完成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 回答