2012-06-18 30 views
4

如何拆分由空格一个字符串,如果它不是用这种支架的[]Java的独立字符串由空格不是括号[]

因此字符串" book [new interesting book] buy it "应在

book 
new interesting book 
buy 
it 
分割包围

book 
[new interesting book] 
buy 
it 

谢谢!

回答

3

它是否必须是正则表达式?您可以在一次迭代中执行,只需通过计算空格之前有多少个括号来确定该空格是否应由新行标记替换。

String data="book [new [interesting] book] buy it"; 
StringBuilder buffer=new StringBuilder(); 
int bracketCounter=0; 
for (char c:data.toCharArray()){ 
    if (c=='[') bracketCounter++; 
    if (c==']') bracketCounter--; 
    if (c==' ' && bracketCounter==0) 
     buffer.append("\n"); 
    else 
     buffer.append(c); 
} 
System.out.println(buffer); 

日期:

book 
[new [interesting] book] 
buy 
it 
0
String input = "foo [bar bar] foo"; 
Pattern p = Pattern.compile("\[|\]"); 
String[] s = p.split(input); 

现在我们将[],[括号内的部分和右边的部分]的部分留下。 现在你可以去掉这些部分(如果有必要)并进一步分割它们。

+0

是否需要转义'['和']'字符? \ [和\]? – Tom

+0

是的,当然..你应该使用'\ ['和'\]'。我相应地编辑了我的答案。谢谢! –

2

这是很难用String.split()这里,因为它很难它们的外括号内的空间与空间之间进行区分。相反,持续Matcher.find()对你的字符串,直到你用尽了令牌。

List<String> tokens = new ArrayList<String>(); 
Pattern p = Pattern.compile("\\s*(\\[.*\\]|[^\\s]+)\\s*"); 
Matcher m = p.matcher(" book [new interesting book] buy it "); 
while (m.find()) { 
    tokens.add(m.group()); 
} 
System.out.println(tokens); 
// Prints: [ book , [new interesting book] , buy , it ] 

正则表达式以上忽略的前缘和后空格,和抓斗:(1)任何事情,如果它是括号或(2)非空间中的任何序列之内。

2

我已经改变了一点@ cheeken的回应,只是为了改善一点点。我决定把它列入,因为代码格式化回答:

List<String> tokens = new ArrayList<String>(); 
Pattern p = Pattern.compile("\\s*(\\[.*\\]|[\\S]*)\\s*"); 
Matcher m = p.matcher(" book [new interesting book] buy it "); 
while (m.find()) {    
    if (!m.group().matches("\\s*")) {  
     tokens.add(m.group()); 
    } 
} 

我改变了模式的第二部分,以使用预定义类的\ s,而不是他的否定和我测试的模式对空字符串,以避免包括他的答案允许的最初和最后的空格。