Подтвердить что ты не робот

Как я могу разбить строку на Java и сохранить разделители?

У меня есть эта строка (Java 1.5):

:alpha;beta:gamma;delta

Мне нужно получить массив:

{":alpha", ";beta", ":gamma", ";delta"}

Каков наиболее удобный способ сделать это в Java?

4b9b3361

Ответ 1

str.split("(?=[:;])")

Это даст вам желаемый массив, только с пустым первым элементом. А:

str.split("(?=\\b[:;])")

Это даст массив без пустого первого элемента.

  • Ключевым моментом здесь является (?=X), который представляет собой позиционную структуру с нулевой шириной (не захватывающая конструкция) (см. документы шаблона регулярного выражения).
  • [:;] означает "либо: или:"
  • \b - это граница слова - это там, чтобы не рассматривать первый : как разделитель (так как это начало последовательности)

Ответ 2

Чтобы сохранить разделители, вы можете использовать StringTokenizer:

new StringTokenizer(":alpha;beta:gamma;delta", ":;", true)

Это даст разделителям как токены.

Чтобы использовать их как часть ваших жетонов, вы можете использовать String#split с lookahead.

Ответ 3

Вы можете сделать это, просто используя шаблоны и класс сопряжения в 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()]);
    }

Ответ 4

/**
 * @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()]);
}

Ответ 5

Это должно работать с 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

Ответ 6

Предполагая, что перед словами в вашей строке (например;,: и т.д.) у вас есть только конечный набор разделителей, вы можете использовать следующую технику. (извинения за любые синтаксические ошибки, но это было некоторое время с тех пор, как я использовал Java)

String toSplit = ":alpha;beta:gamma;delta "
toSplit = toSplit.replace(":", "~:")
toSplit = toSplit.replace(";", "~;")
//repeat for all you possible seperators
String[] splitStrings = toSplit.split("~")