控制拆分如何分解"清空"部分

时间:2015-09-11 23:02:59

标签: java split

这是我的字符串....
          〜ABC DEF ~~ ~~~ b ~~~

我想用(〜)分割这个字符串。使用简单的简单我不能将最后一部分作为空白/ null。

输出m寻找..

null
abc
null
null
def
null
null
null
b
null
null
null

4 个答案:

答案 0 :(得分:2)

split不会返回null,而是""空字符串。默认情况下,它还会从结果数组中删除空尾随字符串。如果您要关闭此优化,请使用split(regex,limit),其中包含负limit

text.split("~", -1)

但请注意,split只在分隔符之间生成空元素 。因此,对于像~~~和分隔符~这样的部分文本,它只会生成两个空字符串。如果你真的想要产生三个空格,你可以使用像

这样的东西
text.split("~|(?<=~)(?<!^~|~$)", -1)

此正则表达式的想法是不仅要在~上拆分,而且还要在~之类的分隔符组中的最后~~之后立即拆分以添加空字符串。这种方法的问题是当我们分割放置在字符串的开头或结尾的~时,不需要这样的空字符串,所以我们需要避免这种倾斜。

为了实现这一切,我使用了look-around mechanism,或者更确切地说,使用了后方(?<=...)和负面后方(?<!...)。这些机制将检查在...部分中指定的正则表达式当前位置存在/不存在之前是否匹配。

所以~|(?<=~)(?<!^~|~$)会分开

  • ~每个代字号

  • |

  • (?<=~)前面有~的地方,

    • (?<!^~|~$)但不是之后:

      • ^~代字号位于字符串的开头(由^锚点表示),
      • ~$位于字符串的末尾(由$锚点表示。)

样本:

String text = "~abc~~def~~~b~c~~~";
for (String s : text.split("~|(?<=~)(?<!^~|~$)", -1)) {
    System.out.println("'" + s + "'");
}

输出:

''
'abc'
''
''
'def'
''
''
''
'b'
''
'c'
''
''
''

答案 1 :(得分:1)

你不能返回null,但也许这可以帮助你。

String str = "~abc~~def~~~b~~~";
str = str.replaceAll("~", "-");

char[] chars = str.toCharArray();
for (int i =0; i < chars.length; i++)
{
    String check = Character.toString(chars[i]);
    if(check.contentEquals("-"))
    {
        System.out.println();
        System.out.println(check);
    }
    else
    {
        System.out.print(check);
    }

}

答案 2 :(得分:1)

怎么样:

使用String tokenizer在Java中拆分字符串而不拆分:

import java.util.StringTokenizer;

public class tt {
    public static void main(String a[]){
        String s = "012ab567ab0123ab";
        String delims = "ab ";
        StringTokenizer st = new StringTokenizer(s, delims);
        System.out.println("No of Token = " + st.countTokens());
        while (st.hasMoreTokens()) {
            System.out.println(st.nextToken());
        }
    }
}

或使用您的拆分功能

public class MySplit {

public static String[] mySplit(String text,String delemeter){
    java.util.List<String> parts = new java.util.ArrayList<String>();
    text+=delemeter;        

    for (int i = text.indexOf(delemeter), j=0; i != -1;) {
        parts.add(text.substring(j,i));
        j=i+delemeter.length();
        i = text.indexOf(delemeter,j);
    }


    return parts.toArray(new String[0]);
}

public static void main(String[] args) {
    String str="012ab567ab0123ab";
    String delemeter="ab";
    String result[]=mySplit(str,delemeter);
    for(String s:result)
        System.out.println(s);
}

}

答案 3 :(得分:0)

要省略空白/ null,您可以使用Guava

Iterable<String> strs = Splitter.on('~').omitEmptyStrings().split(toSplit);