传递0作为限制参数可以防止尾随空字符串,但是如何阻止前导空字符串?
例如
String[] test = "/Test/Stuff".split("/");
产生一个带“”,“测试”,“东西”的数组。
是的,我知道我可以推出自己的Tokenizer ......但StringTokenizer的API文档说
“StringTokenizer是为保持兼容性而保留的遗留类 原因虽然在新代码中不鼓励使用它。建议 任何寻求此功能的人都使用拆分“
答案 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
实际上在我们公司,我们现在更喜欢使用这种方法来分割我们所有的项目。
答案 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
这个
程序
给
我
问题