如何在Java中拆分字符串并保留分隔符?

时间:2010-09-23 10:46:31

标签: java

我有这个字符串(Java 1.5):

:alpha;beta:gamma;delta

我需要一个数组:

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

在Java中最方便的方法是什么?

6 个答案:

答案 0 :(得分:26)

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

这将为您提供所需的数组,只有空的第一项。和

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

这将为数组提供不带空的第一项。

  • 这里的关键是(?=X),这是一个零宽度的正向前瞻(非捕获构造)(参见regex pattern docs)。
  • [:;]表示“要么;或:”
  • \b是字边界 - 它是为了不将第一个:视为分隔符(因为它是序列的开头)

答案 1 :(得分:4)

要保留分隔符,您可以使用StringTokenizer

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

这会使分隔符成为标记。

要将它们作为令牌的一部分,您可以将String#splitlookahead一起使用。

答案 2 :(得分:1)

您可以通过在java regex中使用模式和匹配器类来完成此任务。

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

这应该适用于Java 1.5(在Java 1.5中引入了Pattern.quote)。

// 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;
}

,例如,这里&#34; a&#34;是分隔符:

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

答案 5 :(得分:-1)

假设您在字符串中的单词之前只有一组有限的分隔符(例如;,:等),您可以使用以下技术。 (对于任何语法错误道歉,但自从我使用Java以来​​已经有一段时间了)

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