正規表現マッチャーを欲張らないようにする方法は?


18

私はファイル内のテキストを置き換えるために正規表現を使用しようとしています(完全なURLをprotocol / domain /に置き換えます):

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

残念ながら.*??量指定子をエスケープしようとしても、文字列と一致しませんか?vimで貪欲でない数量詞をどのようにエスケープする必要がありますか?


2
:help greedy適切なヘルプトピックに移動します。 :help regexpVimの正規表現を説明するヘルプです。
ジェームスサン

回答:


25

Vimの正規表現には、貪欲でないバージョンの演算子用の特別な構文があります(これはちょっと面倒ですが、覚えておく必要があります):http : //vimregex.com/#Non-Greedy

の貪欲でないバージョンは*です\{-}。だから、単純に置き換える.*.\{-}

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

5

私は常に問題を2つのステップに分割することを好みます。

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

非常に魔法の「\ v」を使用して多くのバックスラッシュを回避し、置換の最後の検索を参照し、置換区切り文字を変更します。これらすべての変更により、コードが読みやすくなります。

ここに画像の説明を入力してください


2

を使用し[^\]+/.て、欲張りを防ぐこともできます。[^/]は、「期待するもの/に一致し、それ+を1回以上繰り返します。

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

私が持っている場合は/正規表現では、私が使用されます!、私はエスケープする必要がないように、セパレータとして/

次のURLがあるとします。

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/

置換を適用すると、それが得られます:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.