我正在尝试执行以下操作:
String[] Res = Text.split("[\\p{Punct}\\s]+");
但是,我总是在它们之前得到一些带有空格的单词。如何在不将空格和其他标点符号作为单词本身的一部分的情况下解析句子?
由于您没有提供可以重现问题的示例输入,我只能猜测。我不明白为什么您提供的正则表达式应该在结果中留下空格,除非您使用非 ASCII 空白或标点字符。原因是两者\\p{Punct}
都是\\s
POSIX 字符类仅限于 ASCII,例如\\s
将不匹配\u00a0
。如果[\\p{IsPunctuation}\\p{IsWhite_Space}]+
非 ASCII 标点符号和空白字符是您的问题,请使用。
例子
String text="Some\u00a0words stick together⁈";
String[] res1 = text.split("[\\p{Punct}\\s]+");
System.out.println(Arrays.toString(res1));
String[] res2 = text.split("[\\p{IsPunctuation}\\p{IsWhite_Space}]+");
System.out.println(Arrays.toString(res2));
将产生:
[Some words, stick, together⁈]
[Some, words, stick, together]
在使用它们之前,您需要trim()
数组中的所有字符串。这将消除所有前导和尾随空格。
str = str.trim();
在你的情况下
for(String str : Res) {
str = str.trim();
// use str now, without any white spaces
}
如果还需要保留标点符号,则需要使用StringTokenizer
whichboolean
取值是否保留分隔符。
用于删除可能使用的空格尾随或前导
String str=" java ";
str = str.trim();