帮哥大的同学做python转Java的编程style题时遇到的问题:
问的大致是这样的,统计文本里单词的个数,需要把非字母和数字的字符给去掉,用了两段不同的代码,发现运行结果里对有些单词的统计数量不一致:
代码是这样的:
code1:
for(int i=0;i<line.length();i++ ){
char ch = line.charAt(i);
if(!Character.isLetterOrDigit(ch)) sbtmp.append(' ');
else sbtmp.append(Character.toLowerCase(ch));
}
还有一段比较简单,用了String的replaceAll方法
code2:
line.replaceAll("\\W+", " ").toLowerCase()+" ";
最终结果上面的代码是正确的,下面一段代码运行结果会比实际值小一些。通过打印除了有差异行的处理结果,差别在这里:
原文:
Charlotte so _very_ plain--but then she is our particular friend."
code1处理结果:
charlotte so very plain but then she is our particular friend
code2处理结果:
charlotte so _very_ plain but then she is our particular friend
看到正则表达式的规范里才知道:
\w :匹配包括下划线的任何单词字符,等价于 [A-Z a-z 0-9_]
\W :匹配任何非单词字符,等价于 [^A-Z a-z 0-9_]