我对 split 方法有疑问。我想编写使用
调用 split 方法的程序("a?b?gf#sad", "#?")
,
它会返回
[a,?,b,?,gf,#,sad]
。
有人可以告诉我如何解决这个问题吗?非常感谢。
最佳答案
这个有点棘手,所以我要“用勺子喂”你。但我会证明我的推理。
首先,没有消耗任何输入的事实意味着正则表达式是零宽度匹配(因此不会消耗任何内容)。这意味着向前看和/或向后看。
其次,虽然您的输入示例远非详尽的示例,但似乎已在 ?
旁边完成了分割。或#
.
将这两个事实放在一起给出了这个解决方案:
"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)"
关于java - 奇怪的分割方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10043465/