Làm cách nào để xóa tất cả các từ trùng lặp trên mỗi dòng bằng Notepad ++?


11

Tôi đang làm việc trên một tệp chứa các dòng có từ khóa và một số dòng chứa các từ khóa trùng lặp.

Ví dụ:

dangerous,dangerous,hazardous,perilous

Tôi muốn nói với Notepad ++ rằng tôi muốn xóa mọi từ trùng lặp trên mỗi dòng. Ví dụ này dangerous,sẽ bị xóa:

dangerous,hazardous,perilous

Tôi có một loạt các dòng như thế và đó là lý do tại sao tôi đang tìm kiếm một cách tự động để làm điều này.


1
Thế còn dangerous,hazardous,dangerous,perilous? Nói cách khác, những từ trùng lặp luôn ở cạnh nhau?
Daniel Beck

Câu trả lời:


11

Bạn có thể sử dụng biểu thức chính quy để xóa các từ trùng lặp liên tiếp trong một dòng, tuy nhiên tôi không nghĩ có thể xóa các từ trùng lặp không liên tiếp (ví dụ dangerous, hazardous, dangerous).

Sử dụng biểu thức chính này trong cửa sổ thay thế trong Notepad ++ và đừng quên chọn "Biểu thức chính quy" làm tùy chọn Chế độ tìm kiếm bên dưới:

Regex này sẽ xóa tất cả các từ trùng lặp liên tiếp - cho dù đó là 2 từ trùng lặp hoặc 10 từ trùng lặp liên tiếp: \b(\w+)(?:,\s+\1\b)+ .

Chính xác regex không dấu phẩy sẽ là: \b(\w+)(?:\s+\1\b)+ (có thể hữu ích cho những người dùng khác).

Nếu bạn muốn một regex cụ thể chỉ cho hai từ trùng lặp (nhân đôi), hãy sử dụng regex này : (\b\w+\b)\W+\1.

Đặt regex này vào hộp Thay thế bằng để giữ một lần xuất hiện của từ (nếu không tất cả các từ lặp lại sẽ bị xóa) : ${1} .

Những biểu thức chính quy này sẽ khắc phục một tình huống như tình huống bạn mô tả trong câu hỏi của bạn làm ví dụ. Regex đầu tiên sẽ hoạt động với mọi số từ trùng lặp (ví dụ dangerous, dangerous, dangerous, dangerous, hazardous), trong khi phiên bản thứ hai sẽ chỉ hoạt động cho hai từ trùng lặp (ví dụ:dangerous, dangerous, hazardous ).

Lưu ý: Các biểu thức chính quy sẽ chỉ áp dụng đối với các định dạng được mô tả trong câu hỏi, có nghĩa là định dạng thích two words, two words, anotherword, two-words, two-words, anotherword, three words expression, three words expression, anotherwordsẽ không thay đổi vì regex sẽ không áp dụng đối với họ.


Cảm ơn đã giúp đỡ! Tuy nhiên, tôi nhận được 0 lần xuất hiện, tôi đã thử làm điều này với các từ khóa riêng biệt như bạn đề xuất và nó không hoạt động, tôi cũng đã thử như trước đây và không có gì, vui lòng kiểm tra chụp màn hình của tôi: goo.gl/eZ7Kp
Gabriel

Regex này nên hoạt động: (\b\w+\b)\W+\1cho hai từ trùng lặp. Tôi sẽ chỉnh sửa câu trả lời của tôi. Dấu phẩy là lý do tại sao regex khác không hoạt động.
amiregelz

Tôi đã thử mọi sự kết hợp có thể, không có dấu phẩy, chỉ khoảng trắng, không dấu cách và dấu phẩy, nhưng không có gì. Xin hãy soi sáng cho tôi, đây là tệp văn bản: goo.gl/sP20z
Gabriel

Vấn đề là biểu thức chính quy tôi đã viết trong câu trả lời của mình chỉ áp dụng cho định dạng (tôi nghĩ) mà bạn đã yêu cầu : word, word, anotherword. Tuy nhiên, bạn có nhiều trường hợp hơi khác một chút, như came across, came acrossmột số trường hợp có 3 hoặc 4 từ. Ngoài ra còn có các từ với 'like don'tvà nó làm cho mọi thứ phức tạp hơn trong hệ thống regex Notepad ++ . Hệ thống regex Notepad ++ cũng khá khó chịu và hạn chế, vì vậy giải pháp là sử dụng regex trong python (hoặc ngôn ngữ khác) hoặc tạo các biểu thức chính quy định dạng cụ thể cho Notepad ++.
amiregelz

Một vấn đề khác là hầu hết các từ được sao chép cũng xuất hiện trong dòng trước đó, điều này gây khó khăn cho việc đạt được mục tiêu của bạn. Nếu bạn muốn xóa tất cả các từ trùng lặp, thì điều đó không khó. Bạn có thể làm một cái gì đó như thế này & này . Tôi khuyên bạn nên sử dụng các biểu thức chính quy cụ thể trong Notepad ++ (Tôi có thể giúp bạn, chỉ cho tôi biết tất cả các định dạng của các từ trùng lặp) hoặc xem xét một cách tiếp cận khác cho vấn đề của bạn.
amiregelz

1

Đây là một cách để thực hiện công việc, điều này sẽ thay thế tất cả các từ trùng lặp ngay cả khi chúng không liền kề:

  • Ctrl+H
  • Tìm cái gì: (?:^|\G)(\b\w+\b),?(?=.*\1)
  • Thay thế bằng: LEAVE EMPTY
  • kiểm tra Bọc xung quanh
  • kiểm tra biểu thức chính quy
  • KHÔNG KIỂM TRA . matches newline
  • Replace all

Giải trình:

(?:^|\G)    : non capture group, beginning of line or position of last match
(\b\w+\b)   : group 1, 1 or more word character (ie. [a-zA-Z0-9_]), surrounded by word boundaries
,?          : optional comma
(?=.*\1)    : positive lookahead, check if thhere is the same word (contained in group 1) somewhere after

Đưa ra một đầu vào như: dangerous,dangerous,hazardous,perilous,dangerous,dangerous,hazardous,perilous

Chúng tôi có:

dangerous,hazardous,perilous
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.