2016-03-18 2 views
0

Я пытаюсь разбить строку: несколько символов, таких как !!!, ??, , , обозначают конец предложения, поэтому я хочу, чтобы что-нибудь после этого было на новой строке, например. Приговор hey.. hello split !!! example me. должен быть превращен в:Разбиение предложения

hey.. 
hello split !!! 
example me. 

Что я пробовал:

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

Это прекрасно работает, когда у меня есть несколько точек, но не работает на что-нибудь еще, я не могу добавить восклицательные знаки в это выражение тоже "(?<=[\\.{2,}!{2,}]). Это расщепляется после каждой точки и восклицания. Есть ли способ объединить их? В идеале я хотел, чтобы приложение разделилось после одной точки (что-либо, что означает конец предложения), но я не думаю, что это возможно за один проход ... Спасибо

+0

Вы хотите разделить после одного пунктуации, или только 2+ из них? – Bohemian

ответ

2

Просто сделайте так,

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

ОИР

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

Она захватывает первый символ из списка [?.!] и ожидает того же персонажа присутствовать один или несколько раз. Если да, то расщепление должно происходить рядом с этим.

или

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

Ideone

+1

['" (? <= ([?!.]) \\ 1+) "'] (https://ideone.com/wfkGQU) и ['" (? <= ([?!.]) \ \ 1 {1,99}) "'] (https://ideone.com/xSaCYq) выдаст исключение: * Группа Look-behind не имеет очевидной максимальной длины * –

+0

спасибо, проверьте сейчас. @ WiktorStribiżew I если это '(? <= \\. {2,})' возможно, тогда '(? <= ([?!.]) \\ 1+)' также возможно. Сумасшедшая ява. –

+0

Проблема заключается в обратной ссылке, длина которой неизвестна с самого начала. –

1

В идеале я хотел приложение, чтобы разделить после одной точки тоже (что-нибудь, что означает конец предложения)

Для это первое, что вы должны сказать о том, какие случаи вы рассматриваете как конец предложения. Несколько специальных символов не являются стандартной формой окончания предложения (согласно моим знаниям).

Но если вы помните, что гнусные пользователи или некоторые случайные ошибки заканчиваются тем, что специальные символы выглядят как конец предложения, то, по крайней мере, составляйте список таких случаев, а затем продолжайте.

Для вашей ситуации здесь, где вы хотите разделить строку на несколько специальных символов. не касательно предшествующего текста будет иметь большую помощь, потому что, как Wiktor отметил

Проблема находится в обратной ссылки, длина которого не известно с самого начала.

Таким образом, мы должны найти, что нулевой ширины, где необходимо разделение должно быть сделано. И следующее регулярное выражение делает то же самое.

Regex:

Обратите внимание на space между двумя утверждения во втором regex.If вы хотите, чтобы потреблять предшествующую space при запуске следующей строки.

Объяснение:

  • Это разделится на нулевой ширины, где она предшествует особый и не удалось им.

hey..¦ hello split !!!¦ example me. (| обозначает нулевой ширины)

+1

Спасибо, мне нравится, насколько коротка это – Dodi

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.