Jeśli mam magiczne wyrażenie regularne Vim w literałach łańcuchowych, czy istnieje sposób na przekonwertowanie całego wyrażenia regularnego na alternatywną reprezentację, która używa innego trybu magicznego, więc mógłbym wkleić ten równoważnik regularny do kodu źródłowego?
Na przykład, jeśli chcę przekonwertować ten wzorzec trybu magicznego:
'\m-\=\<\d\+L\=\>\|0[xX][0-9a-fA-F]\+\>'
do trybu bardzo magicznego, aby był bardziej czytelny, coś w stylu:
'\v-=<\d+L=>|0[xX][0-9a-fA-F]+>'
Często popełniam błędy, próbując przekonwertować je ręcznie.
regular-expression
Mu Mind
źródło
źródło
[0-9]+
w niemagiczny ... ;-)Odpowiedzi:
Komenda
powinno wystarczyć, aby przekształcić dowolny wzór w
\v
tryb. Nie zamieni jednak\m
znacznika lil ' - i o ile mi wiadomo, nie jest to możliwe w przypadku pojedynczego zastąpienia. Jest jednak wystarczająco krótki, aby pisać ręcznie, a następnie możesz po prostu zrobić:s/\\m/\\v
dla znacznika trybu.\W
jest skrótem, dla[^a-zA-Z0-9_]
którego (negowany) zestaw znaków, na którym działa tryb bardzo magiczny. To po prostu usuwa wszelkie ukośniki odwrotne bezpośrednio poprzedzające jeden z tych znaków. Znany problem: zastąpi to\\
wewnętrzne ciągi do\
. Można wymienić\W
z\c[^a-z0-9\_]
złagodzić, ale to będzie nadal bałagan regex dosłowny, gdy uruchomisz go kilka razy i również nie dłuższych ciągów ewakuacyjnych (zawierających\\\\
na przykład)Aktualizacja: Oryginalne pytanie sprawia, że nie jest jasne, czy musisz się z
\v
powrotem przekształcić\m
, ale dostępne polecenie:źródło