1

我对拆分方法有疑问。我想编写调用 split 方法的程序

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

它会回来

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

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

4

3 回答 3

2

这个有点棘手,所以我要“勺子喂”你。但我会展示我的推理。

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

其次,尽管您的输入样本远不是一个详尽的示例,但似乎拆分是在or旁边 完成的。?#

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

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

这是正则表达式的含义:

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

这是一个测试:

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

输出:

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

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

于 2012-04-06T12:45:39.993 回答
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]
于 2012-04-06T12:45:46.720 回答
0

您必须在单词边界上进行拆分,并且存在于Pattern的 javadoc 中,请参阅“边界匹配器”。事实上,这是家庭作业,请阅读文档;有表现力的精美珠宝。

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

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

于 2012-04-06T13:04:24.623 回答