我有以下形式的字符串:
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+");
答案 0 :(得分:7)
通过匹配内容而不是分隔符来更好地分割:
final Matcher m = Pattern.compile("\\w+\\(.*?\\)").matcher(input);
final List<String> matches = new ArrayList<>();
while (m.find()) matches.add(m.group());
答案 1 :(得分: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的回答一样。
答案 2 :(得分:1)
这应该有效:
Pattern ptrn = Pattern.compile("\\w+\\(.+?\\)");
答案 3 :(得分:0)
为什么不拆分“)”,然后将其附加到所有找到的令牌?
String [] results = str.split( ")" );
String token1 = results[0].trim() + ")"; // the trim is to remove leading spaces
这假设您的所有数据都与呈现的格式匹配。