Làm thế nào tôi có thể làm cho trận đấu của tôi không tham lam trong vim?


480

Tôi có một tệp HTML lớn có nhiều đánh dấu giống như thế này:

<p class="MsoNormal" style="margin: 0in 0in 0pt;">
  <span style="font-size: small; font-family: Times New Roman;">stuff here</span>
</p>

Tôi đang cố gắng thực hiện tìm kiếm và thay thế Vim để loại bỏ tất cả class=""style=""nhưng tôi gặp khó khăn khi khiến trận đấu trở nên vô duyên.

Nỗ lực đầu tiên của tôi là

%s/style=".*?"//g

nhưng Vim dường như không thích ?. Thật không may loại bỏ ?làm cho trận đấu quá tham lam.

Làm thế nào tôi có thể làm cho trận đấu của tôi vô duyên?


Tôi nghĩ câu trả lời của Paul là tốt. Chỉ cần nói rằng "?" không có nghĩa là tùy chọn trong vim (nếu đây là những gì bạn muốn đạt được bằng cách sử dụng "?")
LB40

15
@LB, bằng nhiều ngôn ngữ ,. *? có nghĩa là phù hợp với bất kỳ nhân vật nhưng không tham lam. Đó là những gì anh ấy đang cố gắng để đạt được.
Randy Morris

Câu trả lời:


734

Thay vì .*sử dụng .\{-}.

%s/style=".\{-}"//g

Cũng thấy :help non-greedy


38
Không trực quan lắm, đây có phải là thứ mà chỉ vim không?
Ehtesh Choudhury

95
Mọi thứ đều có ngôn ngữ biểu đạt chính quy của riêng nó ... đó là một trong những vấn đề lớn nhất với regex.
Patrick Farrell

35
Rất nhiều trong số các công cụ này đã trưởng thành cùng một lúc và độc lập phát triển phương ngữ riêng của ngôn ngữ biểu thức chính quy. Nhiều trong số các công cụ này cũng đang cố gắng giải quyết các vấn đề khác nhau để có ý nghĩa rằng cú pháp có thể cực kỳ khác biệt - khác nhau trong các triển khai này. Chúng ta phải chấp nhận rằng đây chỉ là cách thế giới thực hoạt động mặc dù đôi khi nó khiến cuộc sống của chúng ta trở nên khó khăn hơn khi trở thành nhà phát triển. May mắn thay, nhiều công cụ ít nhất cung cấp một triển khai regex tương thích với Perl những ngày này. Thật không may, Vim không phải là một trong số họ.
Randy Morris

15
Nếu bất cứ ai như tôi mặc định tìm kiếm của họ \v(cờ rất kỳ diệu), bạn sẽ muốn sử dụng .{-}.
jgillman

48
@Shurane @Ziggy Mnemonic: kiểm soát số lần lặp lại giống như {1,3}(niềng răng). Dấu trừ -có nghĩa là: lặp lại càng ít càng tốt (ít == trừ);)
Ciro Santilli 冠状 病 六四 事件 法轮功

58

Tìm kiếm không tham lam trong vim được thực hiện bằng toán tử {-}. Như thế này:

%s/style=".\{-}"//g

thử xem:

:help non-greedy

48

Có chuyện gì với

%s/style="[^"]*"//g

7
Mặc dù, vì lợi ích của riêng tôi, tôi vẫn muốn hiểu rõ hơn về điều vô duyên.
Đánh dấu Biek

17

Nếu bạn thấy cú pháp regex PCRE thoải mái hơn, mà

  1. hỗ trợ toán tử không tham lam?, như bạn đã hỏi trong OP; và
  2. không yêu cầu các nhóm toán tử phân nhóm và nhập lại (yêu cầu cú pháp vim hoàn toàn trái ngược vì bạn không khớp các ký tự bằng chữ nhưng chỉ định toán tử); và
  3. bạn đã [g] vim được biên dịch với tính năng perl, kiểm tra bằng cách sử dụng

    : ver và kiểm tra tính năng; nếu + perl là bạn tốt để đi)

thử tìm kiếm / thay thế bằng

:perldo s///

Thí dụ. Hoán đổi các thuộc tính src và alt trong thẻ img:

<p class="logo"><a href="/"><img src="/caminoglobal_en/includes/themes/camino/images/header_logo.png" alt=""></a></p>

:perldo s/(src=".*?")\s+(alt=".*?")/$2 $1/

<p class="logo"><a href="/"><img alt="" src="/caminoglobal_en/includes/themes/camino/images/header_logo.png"></a></p>

1
perldohoạt động tuyệt vời, nhưng tiếc là không làm nổi bật bài kiểm tra đã chọn trong khi gõ regex.
mljrg

12

Tôi đã thấy rằng một giải pháp tốt cho loại câu hỏi này là:

:%! sed ...

(hoặc perl nếu bạn thích). IOW, thay vì học đặc thù regex của vim, hãy sử dụng một công cụ mà bạn đã biết. Sử dụng perl sẽ làm cho? Công cụ sửa đổi để vô duyên trận đấu.


2
điểm tốt, nhưng có thể làm /patternđể kiểm tra xem bạn có khớp mẫu chính xác hay không trước khi áp dụng nó và sử dụng công cụ csửa đổi trong biểu thức thông thường vim của bạn cũng rất hay :)
João Portela

chính xác. tất cả các giải pháp ở đây không gần với không tham lam! nếu bạn phải khớp [0-9] \ {7} trong một dòng có nhiều văn bản và một số lần xuất hiện của mẫu đó, sẽ không có giải pháp nào ở đây làm được. Các giải pháp ở đây chỉ hoạt động cho những điều đơn giản (mà công bằng, là những gì đã được yêu cầu). nhưng nếu bạn đang làm nhiều hơn một chút so với tìm kiếm cho đến trích dẫn tiếp theo, vim sẽ không giúp đỡ.
gcb

4

Với \v(như được đề xuất trong một số ý kiến)

:%s/\v(style|class)\=".{-}"//g


-4

Ngày mai

Quá trình xử lý regrec của Vim không quá xuất sắc. Tôi đã thấy rằng cú pháp regrec cho sed là về sự phù hợp với khả năng của vim.

Tôi thường đặt đánh dấu tìm kiếm trên (: set hlsearch) và sau đó chơi với regrec sau khi nhập dấu gạch chéo để vào chế độ tìm kiếm.

Chỉnh sửa: Đánh dấu, mẹo đó để giảm thiểu kết hợp tham lam cũng được đề cập trong cuốn sách tuyệt vời "Sed & Awk" của Dale Dougherty ( liên kết vệ sinh Amazon ).

Chương ba "Tìm hiểu cú pháp biểu hiện thường xuyên" là một phần giới thiệu tuyệt vời cho các khả năng regrec nguyên thủy hơn liên quan đến sed và awk. Chỉ đọc ngắn và rất khuyến khích.

HTH

chúc mừng


7
Xử lý regex của Vim thực sự khá tốt. Nó có thể thực hiện những việc mà sed không thể, như khớp với số dòng / cột hoặc khớp dựa trên phân loại ký tự theo ngôn ngữ dưới dạng từ khóa hoặc mã định danh hoặc khoảng trắng. Nó cũng có các xác nhận độ rộng bằng không và khả năng đặt các biểu thức ở phía bên phải của một sự thay thế. Nếu bạn sử dụng \vnó sẽ giúp làm sạch cú pháp rất nhiều.
Brian Carper

1
@Brian, chúc mừng. Tôi sẽ làm một regex trợ giúp và xem những gì tôi đã thiếu.
Rob Wells

@RobWells, Sed & Awk , thực sự là một cuốn sách rất hay, không dành nhiều lời cho các bộ lượng hóa tham lam / lười biếng. Như một bằng chứng, hoàn toàn không có sự xuất hiện của những từ tham lam hay tham lam trong cuốn sách, và chỉ có một, nhưng không liên quan, xuất hiện từ lười biếng .
Enrico Maria De Angelis

@EnricoMariaDeAngelis đó là nhưng ví dụ không đề cập đến thuật ngữ rõ ràng. Đó là về cách điều chỉnh regex của bạn để sử dụng toán tử "không" để đạt được các kết quả không tham lam. Thuật ngữ tham lam và lười biếng đã đến với công cụ NFA của Perl khi họ giới thiệu các nhà khai thác để sửa đổi cụ thể hành vi đối sánh tham lam.
Rob Wells
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.