如何防止java.lang.String.split()创建一个前导空字符串?

时间:2012-02-22 05:24:00

标签: java string

传递0作为限制参数可以防止尾随空字符串,但是如何阻止前导空字符串?

例如

String[] test = "/Test/Stuff".split("/");

产生一个带“”,“测试”,“东西”的数组。

是的,我知道我可以推出自己的Tokenizer ......但StringTokenizer的API文档说

  

“StringTokenizer是为保持兼容性而保留的遗留类   原因虽然在新代码中不鼓励使用它。建议   任何寻求此功能的人都使用拆分“

9 个答案:

答案 0 :(得分:45)

你最好的选择可能只是去掉任何领先的分隔符:

String input = "/Test/Stuff";
String[] test = input.replaceFirst("^/", "").split("/");

你可以把它放在一个方法中,使它更通用:

public String[] mySplit(final String input, final String delim)
{
    return input.replaceFirst("^" + delim, "").split(delim);
}

String[] test = mySplit("/Test/Stuff", "/");

答案 1 :(得分:21)

Apache Commons有一个实用方法:org.apache.commons.lang.StringUtils.split

StringUtils.split()

实际上在我们公司,我们现在更喜欢使用这种方法来分割我们所有的项目。

答案 2 :(得分:6)

我不认为有一种方法可以使用内置的split方法执行此操作。所以你有两个选择:

1)进行自己的分割

2)在调用split后删除数组并删除空元素

如果你自己进行拆分,你可以将这两个选项结合起来

public List<String> split(String inString)
{
   List<String> outList = new ArrayList<>();
   String[]     test    = inString.split("/");

   for(String s : test)
   {
       if(s != null && s.length() > 0)
           outList.add(s);
   }

   return outList;
}

或者您可以在调用split之前检查分隔符是否在第一个位置,如果是,则忽略第一个字符:

String   delimiter       = "/";
String   delimitedString = "/Test/Stuff";
String[] test;

if(delimitedString.startsWith(delimiter)){
    //start at the 1st character not the 0th
    test = delimitedString.substring(1).split(delimiter); 
}
else
    test = delimitedString.split(delimiter);

答案 3 :(得分:1)

我认为您必须手动删除第一个空字符串。一个简单的方法就是这个 -

  String string, subString;
  int index;
  String[] test;

  string = "/Test/Stuff";
  index  = string.indexOf("/");
  subString = string.substring(index+1);

  test = subString.split("/"); 

这将排除前导空字符串。

答案 4 :(得分:1)

我认为没有内置函数可以删除Java中的空白字符串。您可以消除空白删除字符串,但可能会导致错误。为安全起见,您可以通过编写如下代码来执行此操作:

  List<String> list = new ArrayList<String>();

  for(String str : test) 
  {
     if(str != null && str.length() > 0) 
     {
         list.add(str);
     }
  }

  test = stringList.toArray(new String[list.size()]);

答案 5 :(得分:0)

您可以将StringTokenizer用于此目的......

String test1 = "/Test/Stuff";
        StringTokenizer st = new StringTokenizer(test1,"/");
        while(st.hasMoreTokens())
            System.out.println(st.nextToken());

答案 6 :(得分:0)

这就是我解决这个问题的方法。我接受字符串,在其上调用.toCharArray()将其拆分为一个字符数组,然后遍历该数组并将其添加到我的字符串列表中(用String.valueOf包装每个字符串)。我想有一些性能权衡,但它似乎是一个可读的解决方案。希望这可以帮助!

 char[] stringChars = string.toCharArray(); 
 List<String> stringList = new ArrayList<>(); 

 for (char stringChar : stringChars) { 
      stringList.add(String.valueOf(stringChar)); 
 }

答案 7 :(得分:0)

使用JDK8和流时,只需在分割后添加skip(1)。剪断后,将解码(非常有线的)十六进制编码的字符串。

The errot I get:
ERROR GrailsExceptionResolver - Column 'expertice.id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
com.microsoft.sqlserver.jdbc.SQLServerException: Column 'expertice.id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
        at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)
        at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1515)
        at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:404)
        at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350)
        at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715)
        at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180)
        at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155)
        at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:285)
        at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93)
        at com.bayer.bbs.emea.web.wbt.TestController$_closure4_closure13.doCall(TestController.groovy:65)
        at com.bayer.bbs.emea.web.wbt.TestController$_closure4.doCall(TestController.groovy:29)
        at com.bayer.bbs.emea.web.wbt.TestController$_closure4.doCall(TestController.groovy)
        at java.lang.Thread.run(Thread.java:662)

答案 8 :(得分:-2)

在打印字符串之前,只能添加if(StringUtils.isEmpty(string)) continue;之类的语句。我的JDK版本1.8,不会打印空白。 5 这个 程序 给 我 问题