Java用空格分隔字符串,不被[]括号包围

Java用空格分隔字符串,不被[]括号包围,java,regex,Java,Regex,如果一个字符串没有被这种括号包围,我如何用空格分割它 所以字符串“book[新有趣的书]buy it”应该拆分为 book new interesting book buy it 或 谢谢大家! String input = "foo [bar bar] foo"; Pattern p = Pattern.compile("\[|\]"); String[] s = p.split(input); 现在我们有了[,括号内的部分和右边的部分]。 现在,您可以遍历这些部分(如果需要)并进一步拆分

如果一个字符串没有被这种括号包围,我如何用空格分割它

所以字符串
“book[新有趣的书]buy it”
应该拆分为

book
new interesting book
buy
it

谢谢大家!

String input = "foo [bar bar] foo";
Pattern p = Pattern.compile("\[|\]");
String[] s = p.split(input);
现在我们有了[,括号内的部分和右边的部分]。
现在,您可以遍历这些部分(如果需要)并进一步拆分它们。

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

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);
输出:


这里很难使用
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 ]
List tokens=new ArrayList();
模式p=Pattern.compile(\\s*(\\[.\\\]\\[^\\s]+)\\s*”;
Matcher m=p.Matcher(“书[新有趣的书]买它”);
while(m.find()){
添加(m.group());
}
System.out.println(代币);
//印刷品:[书,[新有趣的书],买,它]

上面的正则表达式忽略了前导和尾随空格,并抓取:(1)括号内的任何内容,或(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());
    }
}
List tokens=new ArrayList();
模式p=Pattern.compile(\\s*(\\[\\\\]\\[\\s]*)\\s*”;
Matcher m=p.Matcher(“书[新有趣的书]买它”);
而(m.find()){
如果(!m.group().matches(“\\s*”){
添加(m.group());
}
}

我更改了模式的第二部分,以便使用预定义的\S类而不是他的否定,并针对空字符串测试了模式,以避免包含其答案允许的初始和最终空格

“[”和“]”字符是否需要转义,例如,[和]?当然可以。。您应该使用
\[
\]
。我据此编辑了我的答案。谢谢
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 ]
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());
    }
}