奇怪的分裂方法

时间:2012-04-06 12:26:26

标签: java split

我对split方法有疑问。我想用

编写我调用split方法的程序

("a?b?gf#sad", "#?")

它会返回

[a,?,b,?,gf,#,sad]

有人可以告诉我该如何解决这个问题?非常感谢你。

3 个答案:

答案 0 :(得分:2)

这个有点棘手,所以我要“给你喂勺子”。但我会说明我的理由。

首先,没有输入消耗的事实意味着正则表达式是零宽度匹配(因此不消耗任何东西)。这意味着前瞻和/或后视。

其次,虽然您的输入示例远非详尽的示例,但似乎分割是在 ?#旁边完成的。

将这两个事实放在一起为我们提供了这个解决方案:

"a?b?gf#sad".split("(?<=[?#])|(?=[?#])");

以下是正则表达式的含义:

  • (?<=[?#])是一个后视断言,前一个字符是?#
  • (?=[?#])是一个前瞻声明下一个字符是?#
  • A|B表示“A或B”,所以整个正则表达式都是环顾四周

这是一个测试:

System.out.println(Arrays.toString("a?b?gf#sad".split("(?<=[?#])|(?=[?#])")));

输出:

[a, ?, b, ?, gf, #, sad]

请注意,如果您想将拆分扩展为“任何非单词字符”(而不仅仅是?#),您只需将拆分正则表达式更改为"(?<=\\W)|(?=\\W)"

答案 1 :(得分:0)

使用StringTokenizer:

    String s = "a?b?gf#sad";
    final StringTokenizer stringTokenizer = new StringTokenizer(s, "#?", true);
    String[] a = new String[stringTokenizer.countTokens()];
    int i = 0;
    while(stringTokenizer.hasMoreTokens())
        a[i++] = stringTokenizer.nextToken();
    System.out.println(Arrays.toString(a));

打印:

 [a, ?, b, ?, gf, #, sad]

答案 2 :(得分:0)

您必须拆分字边界,并且存在于Pattern的javadoc中,请参阅“边界匹配器”。事实上这是作业,阅读文档;有很好的表现力的珠宝。

"a?b?gf#sad".split("\\b");

还要考虑两个特殊标志会发生什么:"a?#b?#gf##sad"