Wie kann man Regex-Matcher nicht gierig machen?


17

Ich versuche, einen regulären Ausdruck zum Ersetzen von Text in einer Datei zu verwenden (ersetzen Sie eine vollständige URL nur durch protocol / domain /):

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

Leider .*?passt der String nicht, auch wenn versucht wird, dem ?Quantor zu entkommen ? Wie soll ein nicht gieriger Quantor in vim entkommen?


2
:help greedyhätte Sie zum richtigen Hilfethema geführt. :help regexpist die Hilfe, die Vims Regex-Geschmack beschreibt.
Jamessan

Antworten:


25

Vims Regex hat eine spezielle Syntax für nicht-gierige Versionen von Operatoren (es ist etwas ärgerlich, aber Sie müssen sie sich nur merken): http://vimregex.com/#Non-Greedy

Die nicht gierige Version von *ist \{-}. Also einfach ersetzen .*durch .\{-}:

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

5

Ich ziehe es vor, das Problem immer in zwei Schritte zu unterteilen:

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

Verwenden Sie sehr magisches "\ v", um viele Backslashes zu vermeiden, verweisen Sie auf die letzte Suche in der Substitution und ändern Sie das Substitutionsbegrenzungszeichen. All diese Änderungen verbessern die Lesbarkeit des Codes.

Bildbeschreibung hier eingeben


2

Sie können auch die verwenden [^\]+/., um Gier zu verhindern. [^/]bedeutet "Finde alles /, was du erwartest" und +wiederholt dies ein oder mehrere Male.

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

Wenn ich /in der Regex habe, werde ich !als Trennzeichen verwenden, damit ich nicht entkommen muss /.

Beispiel

Angenommen, Sie haben die folgenden URLs:

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/

Wenn Sie die Substitution anwenden, erhalten Sie Folgendes:

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.