我尝试拆分字符串:!!!
,??
,...
等多个字符表示句子的结尾,所以在此之后我想要任何内容一条新线,例如句子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点之后分开(任何表示句子结尾的内容)但我不认为这可以在一次通过中...谢谢
答案 0 :(得分:2)
就这样做,
String [] split = myStr.split("(?<=([?!.])\\1+)");
OIR
String [] split = myStr.split("(?<=([?!.])\\1{1,99})");
它捕获列表[?.!]
中的第一个字符,并期望相同的字符出现一次或多次。如果是,则应在此旁边进行拆分。 击>
或
String[] split = s.split("(?<=\\.{2,}+)|(?<=\\?{2,}+)|(?<=!{2,}+)");
答案 1 :(得分:1)
理想情况下,我希望应用程序在SINGLE点之后分割(任何表示句子结尾的内容)
首先要做到这一点,你必须确定你认为哪些案例句末。多个特殊符号不是结束句子的标准形式(据我所知)。
但是如果你记住那些邪恶的用户或一些偶然的错误,最终会使特殊符号看起来像句子的结尾,那么至少要列出这些案例,然后继续。
对于您希望在多个特殊符号上拆分字符串的情况。 Lookbehind 不会有太大帮助,因为Wiktor指出
问题在于反向引用,其长度从一开始就不知道。
所以我们需要找到零宽度,其中需要进行拆分。并且跟随正则表达式也是如此。
正则表达式:
(?<=[.!?])(?=[^.!?])
Regex101 Demo Ideone Demo
(?<=[.!?]) (?=[^.!?])
Regex101 Demo Ideone Demo 注意第二个正则表达式中两个断言之间的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.