Làm thế nào để làm cho mai mối regex không tham lam?


17

Tôi đang cố gắng sử dụng regex để thay thế văn bản trong một tệp (thay thế một url đầy đủ chỉ bằng giao thức / tên miền /):

:%s/\(https\?:\/\/.*?\/\).*/\1/gc

Thật không may .*?, không khớp với chuỗi, thậm chí cố gắng thoát khỏi bộ ?định lượng? Làm thế nào nên định lượng không tham lam trong vim?


2
:help greedysẽ đưa bạn đến chủ đề trợ giúp đúng. :help regexplà sự giúp đỡ mô tả hương vị regex của Vim.
jamessan

Câu trả lời:


25

Regex của Vim có cú pháp đặc biệt dành cho các phiên bản toán tử không tham lam (điều này gây khó chịu, nhưng bạn chỉ cần ghi nhớ chúng): http://vimregex.com/#Non-Greedy

Phiên bản không tham lam của *\{-}. Vì vậy, chỉ cần thay thế .*bằng .\{-}:

:%s/\(https\?:\/\/.\{-}\/\).*/\1/gc

5

Tôi thích luôn luôn giải quyết vấn đề thành hai bước:

/\v(https?):\/\/(.{-})\/.*        <-- Search
:%s,,Protocol:\1 - Domain:\2,g    <-- Substitution

Sử dụng rất kỳ diệu "\ v" để tránh nhiều dấu gạch chéo ngược, tham chiếu tìm kiếm cuối cùng thay thế và thay đổi dấu phân cách thay thế. Tất cả những thay đổi này làm cho mã dễ đọc hơn.

nhập mô tả hình ảnh ở đây


2

Bạn cũng có thể sử dụng [^\]+/.để ngăn chặn sự tham lam. [^/]có nghĩa là "khớp bất cứ điều gì mong đợi /+lặp lại điều đó một hoặc nhiều lần ..

:%s!\v^(https?)\://([^/]+)/.*$!Protocol:\1 \t Domain:\2!g

Nếu tôi có /trong regex, tôi sẽ sử dụng !như một dấu phân cách để tôi không phải trốn thoát /.

Thí dụ

Giả sử bạn có các url sau:

http://academy.mises.org/courses/econgd/
http://academy.mises.org/moodle/course/view.php?id=172
http://acmsel.safaribooksonline.com/book/-/9781449358204?bookview=overview
http://acmsel.safaribooksonline.com/home
http://acordes.lacuerda.net/bebo__cigala/lagrimas_negras-2.shtml
http://acordes.lacuerda.net/jose_antonio_labordeta/albada.shtml
http://anarchitext.wordpress.com/category/new-middle-east/
https://courses.edx.org/courses/course-v1%3ADelftX%2BFP101x%2B3T2015/wiki/DelftX.FP101x.3T2015/resources-and-links/
https://cseweb.ucsd.edu/classes/wi11/cse230/lectures.html
https://developer.mozilla.org/en-US/docs/CSS
https://developers.google.com/edu/python
https://developers.google.com/structured-data/testing-tool/

Áp dụng thay thế bạn sẽ nhận được rằng:

Protocol:http    Domain:academy.mises.org
Protocol:http    Domain:academy.mises.org
Protocol:http    Domain:acmsel.safaribooksonline.com
Protocol:http    Domain:acmsel.safaribooksonline.com
Protocol:http    Domain:acordes.lacuerda.net
Protocol:http    Domain:acordes.lacuerda.net
Protocol:http    Domain:anarchitext.wordpress.com
Protocol:https   Domain:courses.edx.org
Protocol:https   Domain:cseweb.ucsd.edu
Protocol:https   Domain:developer.mozilla.org
Protocol:https   Domain:developers.google.com
Protocol:https   Domain:developers.google.com
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.