2015-10-14 16 views
6

Tôi muốn sửa các dấu ba chấm không đúng định dạng (...) trong một String.Sửa các dấu ba chấm không đúng định dạng trong một chuỗi

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

tất cả nên được sửa chữa để:

"Hello... World..." 

Các regex sau xử lý bất kỳ trường hợp 3 hoặc nhiều hơn liên tiếp . 's:

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

Tuy nhiên, tôi không biết cách xử lý vụ việc khi có chính xác 2 liên tiếp . của. Chúng ta không thể làm điều gì đó như thế này:

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

Ví dụ, đối "...", các mã trên sẽ trở lại "......", như regex sẽ thay thế đầu tiên 2 . 's (chỉ số 0 và 1), sau đó tiếp theo 2 . 's (chỉ số 1 và 2), kết quả là "..." + "..." = "......".

Something như thế này hoạt động:

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

... nhưng phải có một cách tốt hơn!

+4

Chỉ hai hoặc nhiều khoảng thời gian được thay thế bằng ba? –

+0

Làm thế nào về 'line.replaceAll (" \\. + "," ... ");'? Điều này sẽ thay thế bất kỳ chuỗi dấu chấm nào (ví dụ: '.',' ..', '...', '........') theo trình tự của bạn với '...'. – AndrewMcCoist

+0

Đây là câu hỏi "gimme teh codez". Nó phải được đóng lại – user193661

Trả lời

5

Bạn có thể thay thế bất kỳ nhóm của hai hoặc nhiều .:

[.]{2,} 

với ...

1

Bạn có thể làm điều đó bằng cách phủ định, phát hiện tất cả những gì không phải là một hoặc nhiều từ theo sau là một hình elip "đúng", và sửa chữa các hình elip bằng cách sử dụng một biểu thức chính quy như:

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

này có lợi thế của việc không thay thế dấu chấm câu khác so với các dấu ba chấm bị biến dạng.

1

Bạn muốn một cái gì đó như dưới đây (theo mẫu không thoát):

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

Online examples

Về cơ bản, trong hai trường hợp dấu chấm, lookbehind tiêu cực và lookahead được sử dụng để ngăn không cho chúng khớp với chuỗi ba dấu chấm.

3

Tại sao không giữ nó đơn giản?

\.\.+ 

Nếu bạn thực sự không muốn nó gây rối với các nhóm 3 có này:

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

Điều này không là điều này có vẻ cho các nhóm lớn hơn 3 đầu tiên sau đó nó sẽ tìm các nhóm của 2 Điều đặc biệt về "..." là có 2 nhóm ".." trong "...". Vì vậy, trong (?!\.) bạn tìm kiếm "thứ ba". sau lần đầu tiên 2. Nếu thứ ba đó "." tồn tại sau đó loại bỏ kết quả đó. Điều này được gọi là lookahead tiêu cực.Để loại bỏ 2 "..", bạn phải thực hiện lookbehind tiêu cực. Vì vậy, (?<!\.) sẽ tìm kiếm "." trước ngày thứ hai ".." và kết quả này bị hủy nếu tìm thấy.

Không thể thực hiện giao diện phủ định bằng javascript vì vậy tôi đã sử dụng trình duyệt có sử dụng trình biên dịch Java.

Liên kết: https://www.myregextester.com/?r=d41b2f7e

+0

Điều này làm việc tuyệt vời, nhưng người dùng sẽ phải ghi nhớ rằng khi tạo một chuỗi Java, họ sẽ cần một ký tự thoát kép, như trong String pattern = "\\. \\. +"; –

Các vấn đề liên quan