在java中,我需要用'(单引号(拆分句子,句子包含标点符号,如?,^或!
句子只有在句子包含零个或偶数标点符号时才被拆分,否则不会拆分,
注意:
我需要带有拆分逻辑的正则表达式模式,这是我的要求
例如
ABC??'DEF?'GHI'JKL????'MNO'
需要输出...
ABC??
DEF?'GHI //here sentence contains single or odd no of punctuation(?) char, so it wont split by single quote '
JKL????
MNO
我需要Java中的相关正则表达式模式,请提出解决方案
这不是最有效的,但这很容易理解
首先,只需在'
上拆分即可获得String
数组。
然后,对于每个String
,检查您想要的字符量为偶数:
array[i].replaceAll("[^?']", "").length() % 2
// 0 = even
// 1 = odd
基于此,如果结果是奇数,则将当前单元格连接到下一个单元格
array[i+1] = array[i] + array[i+1];
然后清除当前单元格,因为该值已添加到下一次检查中。
array[i] = null;
当然,您需要在最后清除这些空值。这允许您为下一次迭代重新生成String
。
法典:
String tmp = "ABC?'DEF?'GHI'JKL????'MNO'";
String[] split = tmp.split("'");
//don't check the last, because we can't do much for it
for(int i = 0 ; i < split.length - 1; i++) {
//Odd amount of ?'
if(split[i].replaceAll("[^?']", "").length() % 2 > 0) {
//concat with the next item
split[i + 1] = split[i] + "'" + split[i + 1];
//remove current
split[i] = null;
}
}
List<String> list = new ArrayList<String>(Arrays.asList(split));
list.removeIf(s -> s == null);
System.out.println("Result:");
for(String s : list) {
System.out.println(s);
}
"ABC?"定义?吉'JKL????'MNO'">
ABC?'DEF?'GHI
JKL????
MNO
"ABC??"定义?吉'JKL????'MNO'">
ABC??
DEF?'GHI
JKL????
MNO
请注意,我们可以一直使用List
,甚至是Stream
,但Collection
并不是这里的重点。
试试这段代码
String s = "ABC??'DEF?'GHI'JKL????'MNO'";
String[] split = s.split("'");
for (int i = 0; i < split.length; i++)
System.out.println(split[i]);