У меня есть эта строка (Java 1.5):
:alpha;beta:gamma;delta
Мне нужно получить массив:
{":alpha", ";beta", ":gamma", ";delta"}
Каков наиболее удобный способ сделать это в Java?
У меня есть эта строка (Java 1.5):
:alpha;beta:gamma;delta
Мне нужно получить массив:
{":alpha", ";beta", ":gamma", ";delta"}
Каков наиболее удобный способ сделать это в Java?
str.split("(?=[:;])")
Это даст вам желаемый массив, только с пустым первым элементом. А:
str.split("(?=\\b[:;])")
Это даст массив без пустого первого элемента.
(?=X)
, который представляет собой позиционную структуру с нулевой шириной (не захватывающая конструкция) (см. документы шаблона регулярного выражения).[:;]
означает "либо: или:" \b
- это граница слова - это там, чтобы не рассматривать первый :
как разделитель (так как это начало последовательности)Чтобы сохранить разделители, вы можете использовать StringTokenizer:
new StringTokenizer(":alpha;beta:gamma;delta", ":;", true)
Это даст разделителям как токены.
Чтобы использовать их как часть ваших жетонов, вы можете использовать String#split
с lookahead.
Вы можете сделать это, просто используя шаблоны и класс сопряжения в java regx.
public static String[] mysplit(String text)
{
List<String> s = new ArrayList<String>();
Matcher m = Pattern.compile("(:|;)\\w+").matcher(text);
while(m.find()) {
s.add(m.group());
}
return s.toArray(new String[s.size()]);
}
/**
* @param list an empty String list. used for internal purpose.
* @param str String which has to be processed.
* @return Splited String Array with delimiters.
*/
public String[] split(ArrayList<String> list, String str){
for(int i = str.length()-1 ; i >=0 ; i--){
if(!Character.isLetterOrDigit((str.charAt(i)))) {
list.add(str.substring(i, str.length()));
split(list,str.substring(0,i));
break;
}
}
return list.toArray(new String[list.size()]);
}
Это должно работать с Java 1.5 (Pattern.quote был представлен в Java 1.5).
// Split the string on delimiter, but don't delete the delimiter
private String[] splitStringOnDelimiter(String text, String delimiter, String safeSequence){
// A temporary delimiter must be added as Java split method deletes the delimiter
// for safeSequence use something that doesn't occur in your texts
text=text.replaceAll(Pattern.quote(delimiter), safeSequence+delimiter);
return text.split(Pattern.quote(safeSequence));
}
Если первым элементом является проблема:
private String[] splitStringOnDelimiter(String text, String delimiter, String safeSequence){
text=text.replaceAll(Pattern.quote(delimiter), safeSequence+delimiter);
String[] tempArray = text.split(Pattern.quote(safeSequence));
String[] returnArray = new String[tempArray.length-1];
System.arraycopy(tempArray, 1, returnArray, 0, returnArray.length);
return returnArray;
}
Например, здесь "a" обозначает разделитель:
splitStringOnDelimiter("-asd-asd-g----10-9asdas jadd", "a", "<>")
Вы получаете следующее:
1.: -
2.: asd-
3.: asd-g----10-9
4.: asd
5.: as j
6.: add
Если вы действительно хотите это:
1.: -a
2.: sd-a
3.: sd-g----10-9a
4.: sda
5.: s ja
6.: dd
Вы переключаете:
safeSequence+delimiter
с
delimiter+safeSequence
Предполагая, что перед словами в вашей строке (например;,: и т.д.) у вас есть только конечный набор разделителей, вы можете использовать следующую технику. (извинения за любые синтаксические ошибки, но это было некоторое время с тех пор, как я использовал Java)
String toSplit = ":alpha;beta:gamma;delta "
toSplit = toSplit.replace(":", "~:")
toSplit = toSplit.replace(";", "~;")
//repeat for all you possible seperators
String[] splitStrings = toSplit.split("~")