2015-10-14 3 views
6

Я хочу исправить искаженные эллипсы (...) в String.Исправить неправильные эллипсы в строке

"Hello.. World.." 
"Hello... World..."  // this is correct 
"Hello.... World...." 
"Hello..... World....." 

все должны быть исправлены, чтобы:

"Hello... World..." 

Ниже регулярное выражение обрабатывает любой экземпляр 3 или более последовательных .-х:

line.replaceAll("\\.{3,}", "..."); 

Однако я не знаю, как обращаться с корпусом, когда есть ровно 2 последовательных .. Мы не можем сделать что-то вроде этого:

line.replaceAll("\\.{2}", "..."); 

Например, для "...", приведенный выше код будет возвращать "......", как регулярное выражение заменит первые 2 . «с (индексом 0 и 1), то следующие 2 . (индекс 1 и 2), что приводит к "..." + "..." = "......".

Что-то вроде это работает:

line.replaceAll("\\.{2}", "...").replaceAll("\\.{3,}", "..."); 

... но должно быть лучше!

+4

Только два или более периода заменены на три? –

+0

Как насчет 'line.replaceAll (" \\. + "," ... ");'? Это заменит любую последовательность точек (например, '.', '..',' ... ',' ........ ') последовательность с вашим желаемым' ... '. – AndrewMcCoist

+0

Это вопрос «gimme teh codez». Он должен быть закрыт – user193661

ответ

5

Вы можете заменить любую группу из двух или более .:

[.]{2,} 

с ...

1

Вы можете сделать это через отрицание, обнаруживая все, что не один или несколько слов с последующим «правильного» эллипса, и зафиксировать эллипс, используя регулярные выражения, как:

line.replaceAll("[^\\w* ]+([.]{1,})", "...") 

это имеет преимущество не заменять другую пунктуацию, чем неправильные эллипсы.

1

Вы хотите что-то, как показано ниже (в немаскированном форме):

(?<!\.)\.{2}(?!\.)|\.{4,} 

Online examples

В принципе, точечный случай, негативный lookbehind и lookahead используются, чтобы предотвратить их соответствие трехточечной последовательности.

3

Почему бы не сохранить его простым?

\.\.+ 

Если вы действительно не хотите связываться с группами по 3 есть это:

\.{4,}|(?<!\.)\.{2}(?!\.) 

Что это делает это выглядит для групп больше, чем 3 первых, то это выглядит для групп 2 Особая вещь о «...» - это две группы «..» в «...». Итак, в (?!\.) вы ищете третий «.». после первого 2. Если это третий "." существует, то отбросить этот результат. Это называется негативным взглядом.Чтобы отменить второй «..», вы должны выполнить отрицательный lookbehind. Итак, (?<!\.) ищет это "." до 2-го «..», и этот результат отбрасывается, если найден.

Отрицательный lookbehind не может выполняться с помощью javascript, поэтому я использовал тот, который использует компилятор Java.

Ссылка: https://www.myregextester.com/?r=d41b2f7e

+0

Это отлично работает, но пользователи должны иметь в виду, что при создании строки Java им понадобится двойной escape-символ, как в String pattern = "\\. \\. +"; –

Смежные вопросы