我对split方法有疑问。我想用
编写我调用split方法的程序 ("a?b?gf#sad", "#?")
,
它会返回
[a,?,b,?,gf,#,sad]
。
有人可以告诉我该如何解决这个问题?非常感谢你。
答案 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"
。