我对拆分方法有疑问。我想编写调用 split 方法的程序
("a?b?gf#sad", "#?")
,
它会回来
[a,?,b,?,gf,#,sad]
.
有人能告诉我如何解决这个问题吗?非常感谢你。
这个有点棘手,所以我要“勺子喂”你。但我会展示我的推理。
首先,不消耗任何输入的事实意味着正则表达式是零宽度匹配(因此不消耗任何东西)。这意味着向前看和/或向后看。
其次,尽管您的输入样本远不是一个详尽的示例,但似乎拆分是在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)"
使用 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]
您必须在单词边界上进行拆分,并且存在于Pattern的 javadoc 中,请参阅“边界匹配器”。事实上,这是家庭作业,请阅读文档;有表现力的精美珠宝。
"a?b?gf#sad".split("\\b");
还要考虑两个特殊标志会发生什么:"a?#b?#gf##sad"
。