我试图用单词填充ArrayList,但有时它会添加一个空字符,为什么?我怎么能避免这个?
ArrayList<String> textAL = new ArrayList<String>();
String text = "This.IS(a) text example blah? bl:ah";
String regex = "[\\s\\?\\.,:;\\)\\(]";
String[] splittedText = text.split(regex);
for(int i = 0; i < splittedText.length; i++){
if(splittedText[i] != " "){ //ignore whitespace
textAL.add(splittedText[i]);
}
}
for(int i = 0; i < textAL.size(); i++){
System.out.println("t2(" + i + ") "+ textAL.get(i));
}
结果:
textAL(0) This
textAL(1) IS
textAL(2) a
textAL(3)
textAL(4) text
textAL(5) example
textAL(6) blah
textAL(7)
textAL(8) bl
textAL(9)
textAL(10) ah
答案 0 :(得分:2)
您需要为Pattern
添加量词:
String text = "This.IS(a) text example blah? bl:ah";
// Edit: now with removed escapes when not necessary - thanks hwnd
// ┌ original character class
// | ┌ greedy quantifier: "one or more times"
// | |
String regex = "[\\s?.:;)(]+";
String[] splittedText = text.split(regex);
System.out.println(Arrays.toString(splittedText));
<强>输出强>
[This, IS, a, text, example, blah, bl, ah]
答案 1 :(得分:1)
我认为问题在于你忘记了正则表达式末尾的+
,例如,
String regex = "[\\s\\?\\.,:;\\)\\(]+"
但是如
那样简单String regex = "\\W+";
请注意,\\W
与^\\w
测试:
public static void main(String[] args) {
ArrayList
<String> textAL = new ArrayList<String>();
String text = "This.IS(a) text example blah? bl:ah";
// String regex = "[\\s\\?\\.,:;\\)\\(]+";
String regex = "\\W+";
String[] splittedText = text.split(regex);
for(int i = 0; i < splittedText.length; i++){
textAL.add(splittedText[i]);
}
for(int i = 0; i < textAL.size(); i++){
System.out.println("t2(" + i + ") "+ textAL.get(i));
}
}
结果:
t2(0) This
t2(1) IS
t2(2) a
t2(3) text
t2(4) example
t2(5) blah
t2(6) bl
t2(7) ah
修改
您的其他问题在这里:
splittedText[i] != " "
您正在使用!=
运算符比较字符串,而您绝不想使用==
或!=
来比较字符串。相反,请使用equals(...)
或equalsIgnoreCase(...)
方法。理解==
和!=
检查两个对象是否相同而不是您感兴趣的。另一方面,这些方法检查两个字符串是否具有相同的字符相同的顺序,这就是重要的事情。
幸运的是,如果您使用正确的正则表达式,上述内容对于您当前的代码来说不会成为问题,但是在将来的代码中可能会成为一个问题,所以请务必牢记这一点。
答案 2 :(得分:0)
String regex = "[^\\w]+";
如何做到这一点,以便您可以添加自己不想要匹配的角色,比如撇号"[^\\w']+"