我无法找到解决此问题的确切方法。 我想拆分一个有空格并且可以有标点符号的句子。我想保留单词和标点符号并将它们存储在一个数组中。
Example sentence;
We have not met, have we?
Desired array;
{"We", "have", "not", "met", ",", "have", "we", "?"}
我试图在单个String拆分方法中拆分句子。 我已经查看了有关堆栈溢出的其他相关问题,但我无法获得适合我的正则表达式,特别是对于问号。
答案 0 :(得分:2)
您可以尝试使用空格或在非单词字符之前的位置进行拆分:
\s+|(?=\W)
请参阅regex demo
模式详细信息:\s+|(?=\W)
包含两个以|
符号分隔的替代项。 \s+
匹配拆分时删除的1个或多个空格。 (?=\W)
是一个积极的前瞻,只在它包含的模式之前匹配一个空格 - 这里,\W
匹配任何非单词字符(不是字母,数字或下划线)。
注意:如果非单词\W
类过于“贪婪”,您可以使用标点符号类\p{P}
(String pattern = "\\s+|(?=\\p{P})"
)只在标点符号之前分开。
String str = "We have not met, have we?";
String[] chunks = str.split("\\s+|(?=\\W)");
System.out.println(Arrays.toString(chunks));
// => [We, have, not, met, ,, have, we, ?]
如果您需要将非空白/非单词块标记为整个单元(例如,?!!
作为一个数组元素),请使用以下匹配技术:
Pattern ptrn = Pattern.compile("[^\\s\\W]+|\\S+");
Matcher m = ptrn.matcher("We have not met, have we?!!");
List<String> list = new ArrayList<>();
while (m.find()) {
list.add(m.group(0));
}
System.out.println(list); // => [We, have, not, met, ,, have, we, ?!!]
答案 1 :(得分:0)
String sentence="We have not met, have we ?";
String[] splited = sentence.split("\\s+");