Как предотвратить java.lang.String.split() от создания ведущей пустой строки?
передача 0 в качестве предельного аргумента предотвращает завершение пустых строк, но как предотвратить предотвращение ведущих пустых строк?
например
String[] test = "/Test/Stuff".split("/");
приводит к массиву с параметрами "," Test "," Stuff".
Да, я знаю, что могу перевернуть свой собственный токенизатор... но API-документы для StringTokenizer говорят
"StringTokenizer - это унаследованный класс, который сохраняется для совместимости хотя его использование не рекомендуется в новом коде. Рекомендуется что любой, кто ищет эту функциональность, использует раскол"
Ответы
Ответ 1
Лучше всего, наверное, просто снять любой ведущий разделитель:
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", "/");
Ответ 2
Apache Commons имеет метод утилиты для этого: org.apache.commons.lang.StringUtils.split
StringUtils.split()
Фактически в нашей компании мы теперь предпочитаем использовать этот метод для разделения во всех наших проектах.
Ответ 3
Я не думаю, что вы можете сделать это с помощью встроенного метода 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);
Ответ 4
Я думаю, что нет встроенной функции для удаления пустой строки в 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
Вы можете использовать StringTokenizer
для этой цели...
String test1 = "/Test/Stuff";
StringTokenizer st = new StringTokenizer(test1,"/");
while(st.hasMoreTokens())
System.out.println(st.nextToken());
Ответ 6
Я думаю, вам придется вручную удалить первую пустую строку. Простой способ сделать это -
String string, subString;
int index;
String[] test;
string = "/Test/Stuff";
index = string.indexOf("/");
subString = string.substring(index+1);
test = subString.split("/");
Это исключает ведущую пустую строку.
Ответ 7
Вот как я обошел эту проблему. Я беру строку, вызываю .toCharArray() на ней, чтобы разбить ее на массив символов, а затем пропустить этот массив и добавить его в список String (обертывая каждый char с помощью String.valueOf). Я предполагаю, что есть некоторые компромиссы с производительностью, но это похоже на читаемое решение. Надеюсь это поможет!
char[] stringChars = string.toCharArray();
List<String> stringList = new ArrayList<>();
for (char stringChar : stringChars) {
stringList.add(String.valueOf(stringChar));
}