分裂一句话

时间:2016-03-18 09:11:02

标签: java regex

我尝试拆分字符串:!!!??...等多个字符表示句子的结尾,所以在此之后我想要任何内容一条新线,例如句子hey.. hello split !!! example me.应该变成:

hey..
hello split !!!
example me.

我尝试了什么:

String myStr= "hey.. hello split !!! example me.";
String [] split = myStr.split("(?<=\\.{2,})");

当我有多个点但没有其他任何工作时,这样可以正常工作,我也不能在此表达式中添加感叹号"(?<=[\\.{2,}!{2,}])。这在每个点和感叹号之后分裂。有没有办法把它们结合起来? 理想情况下,我希望应用程序在SINGLE点之后分开(任何表示句子结尾的内容)但我不认为这可以在一次通过中...谢谢

3 个答案:

答案 0 :(得分:2)

就这样做,

String [] split = myStr.split("(?<=([?!.])\\1+)");

OIR

String [] split = myStr.split("(?<=([?!.])\\1{1,99})");

它捕获列表[?.!]中的第一个字符,并期望相同的字符出现一次或多次。如果是,则应在此旁边进行拆分。

String[] split = s.split("(?<=\\.{2,}+)|(?<=\\?{2,}+)|(?<=!{2,}+)");

Ideone

答案 1 :(得分:1)

  

理想情况下,我希望应用程序在SINGLE点之后分割(任何表示句子结尾的内容)

首先要做到这一点,你必须确定你认为哪些案例句末。多个特殊符号不是结束句子的标准形式(据我所知)。

但是如果你记住那些邪恶的用户或一些偶然的错误,最终会使特殊符号看起来像句子的结尾,那么至少要列出这些案例,然后继续。

对于您希望在多个特殊符号上拆分字符串的情况。 Lookbehind 不会有太大帮助,因为Wiktor指出

  

问题在于反向引用,其长度从一开始就不知道。

所以我们需要找到零宽度,其中需要进行拆分。并且跟随正则表达式也是如此。

正则表达式:

注意第二个正则表达式中两个断言之间的space。如果你想在下一行开始时使用前面的space

<强>解释

  • 这将分为零宽度,其前面是特殊的,而不是成功的。
  

hey..¦ hello split !!!¦ example me.(|表示零宽度)

答案 2 :(得分:0)

回顾一下,看起来有负面效果以防止在群组中分裂:

String[] lines = s.split("(?<=[?!.]{2,3})(?![?!.])");

一些测试代码:

public static void main (String[] args) {
    String s = "hey..hello split !!!example me.";
    String[] lines = s.split("(?<=[?!.]{2,3})(?![?!.])");
    Arrays.stream(lines).forEach(System.out::println);
}

输出:

hey..
hello split !!!
example me.