Java:如何拆分和保持分隔符

时间:2016-05-04 22:36:07

标签: java regex split

我无法找到解决此问题的确切方法。 我想拆分一个有空格并且可以有标点符号的句子。我想保留单词和标点符号并将它们存储在一个数组中。

 Example sentence;
 We have not met, have we?

 Desired array;
{"We", "have", "not", "met", ",", "have", "we", "?"}

我试图在单个String拆分方法中拆分句子。 我已经查看了有关堆栈溢出的其他相关问题,但我无法获得适合我的正则表达式,特别是对于问号。

2 个答案:

答案 0 :(得分:2)

您可以尝试使用空格或在非单词字符之前的位置进行拆分:

\s+|(?=\W)

请参阅regex demo

模式详细信息\s+|(?=\W)包含两个以|符号分隔的替代项。 \s+匹配拆分时删除的1个或多个空格。 (?=\W)是一个积极的前瞻,只在它包含的模式之前匹配一个空格 - 这里,\W匹配任何非单词字符(不是字母,数字或下划线)。

注意:如果非单词\W类过于“贪婪”,您可以使用标点符号类\p{P}String pattern = "\\s+|(?=\\p{P})")只在标点符号之前分开。

IDEONE Java demo

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, ?!!]

请参阅another IDEONE demoa regex demo

答案 1 :(得分:0)

String sentence="We have not met, have we ?";
String[] splited = sentence.split("\\s+");