按包含零个或偶数个标点字符的正则表达式模式拆分 java



在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]);

最新更新