Ich bemerkte, dass vims Ersatzregex ein bisschen anders als andere Regexp ist. Was ist der Unterschied zwischen ihnen?Was ist der Unterschied zwischen vim Regex und normalen Regex?
Antwort
Wenn von "normalen regex" Sie Perl-Compatible Regular Expressions (PCRE) bedeuten, dann ist die Vim-Hilfe bietet eine gute Zusammenfassung der Unterschiede zwischen Vims Regexes und Perl:
:help perl-patterns
Hier ist, was er sagt, als von Vim 7.2:
9. Compare with Perl patterns *perl-patterns* Vim's regexes are most similar to Perl's, in terms of what you can do. The difference between them is mostly just notation; here's a summary of where they differ: Capability in Vimspeak in Perlspeak ~ ---------------------------------------------------------------- force case insensitivity \c (?i) force case sensitivity \C (?-i) backref-less grouping \%(atom\) (?:atom) conservative quantifiers \{-n,m} *?, +?, ??, {}? 0-width match atom\@= (?=atom) 0-width non-match atom\@! (?!atom) 0-width preceding match atom\@<= (?<=atom) 0-width preceding non-match atom\@<! (?!atom) match without retry atom\@> (?>atom) Vim and Perl handle newline characters inside a string a bit differently: In Perl,^and $ only match at the very beginning and end of the text, by default, but you can set the 'm' flag, which lets them match at embedded newlines as well. You can also set the 's' flag, which causes a . to match newlines as well. (Both these flags can be changed inside a pattern using the same syntax used for the i flag above, BTW.) On the other hand, Vim's^and $ always match at embedded newlines, and you get two separate atoms, \%^ and \%$, which only match at the very start and end of the text, respectively. Vim solves the second problem by giving you the \_ "modifier": put it in front of a . or a character class, and they will match newlines as well. Finally, these constructs are unique to Perl: - execution of arbitrary code in the regex: (?{perl code}) - conditional expressions: (?(condition)true-expr|false-expr) ...and these are unique to Vim: - changing the magic-ness of a pattern: \v \V \m \M (very useful for avoiding backslashitis) - sequence of optionally matching atoms: \%[atoms] - \& (which is to \| what "and" is to "or"; it forces several branches to match at one spot) - matching lines/columns by number: \%5l \%5c \%5v - setting the start and end of the match: \zs \ze
Zu weite Frage. Führen Sie vim aus, und geben Sie :help pattern
ein.
"Regulärer Ausdruck" definiert wirklich Algorithmen, keine Syntax. Das bedeutet, dass verschiedene Varianten regulärer Ausdrücke unterschiedliche Zeichen verwenden, um dasselbe zu bedeuten. oder sie werden einige Sonderzeichen mit Backslashes voranstellen, andere nicht. Sie arbeiten normalerweise immer noch auf die gleiche Weise.
Es war einmal, POSIX defined the Basic Regular Expression Syntax (BRE), die Vim weitgehend folgt. Sehr bald darauf wurde auch ein Extended Regular Expression (ERE) -Syntax-Vorschlag veröffentlicht. Der Hauptunterschied zwischen den beiden besteht darin, dass BRE dazu neigt, mehr Zeichen als Literale zu behandeln - ein "a" ist ein "a", aber auch ein "(" ist ein "(", kein Sonderzeichen) und beinhaltet somit mehr Backslashes geben Sie ihnen "spezielle" Bedeutung.
Die Diskussion der komplexen Unterschiede zwischen Vim und Perl auf einen separaten Kommentar hier ist nützlich, aber es ist auch erwähnenswert einige der einfacheren Möglichkeiten, in denen Vim regexes von der "akzeptierten" Norm abweichen . (., mit denen Sie wahrscheinlich Perl bedeuten) Wie oben erwähnt, sie meist in ihrer Verwendung eines vorhergehenden Backslash unterscheiden
Hier sind einige offensichtliche Beispiele:
Perl Vim Explanation --------------------------- x? x\= Match 0 or 1 of x x+ x\+ Match 1 or more of x (xyz) \(xyz\) Use brackets to group matches x{n,m} x\{n,m} Match n to m of x x*? x\{-} Match 0 or 1 of x, non-greedy x+? x\{-1,} Match 1 or more of x, non-greedy \b \< \> Word boundaries $n \n Backreferences for previously grouped matches
Das gibt Ihnen einen Eindruck der wichtigsten Unterschiede. Aber wenn Sie etwas komplizierter als die Grundlagen tun, schlage ich vor, dass Sie immer davon ausgehen, dass Vim-Regex wird von Perl-Regex oder Javascript-Regex und konsultieren etwas wie die Vim Regex website.
Super, danke. Das stolpert mich jedes Mal auf! –
das war die beste Antwort und half mir herauszufinden, genau das, was ich suchte, danke. – jimh
Es gibt ein Plugin namens eregex.vim, das von PCRE (Perl-kompatible reguläre Ausdrücke) in die Vim-Syntax übersetzt. Es dauert over a thousand lines of vim to achieve that translation! Ich denke, es dient auch als präzise Dokumentation der Unterschiede.
Versuchen Sie Vim's sehr magischen Regex-Modus. Es verhält sich mehr wie eine herkömmliche Regex, Sie können Ihr Muster einfach mit \v
voranstellen. Weitere Informationen finden Sie unter :help /\v
. Ich liebe es.
von traditionellen Regex meinst du Basic Regular Expressions (BRE) oder PCRE? –
pcre :) mehr Texttext – butterywombat
- 1. , was der Unterschied zwischen PHP Regex ist und Javascript regex
- 2. Was ist das \ & pattern in Vim Regex
- 3. Was ist der Unterschied zwischen "Funktion" und "Funktion!" in VIM?
- 4. Was ist der Unterschied zwischen: update und: w in Vim?
- 5. Was ist der Unterschied zwischen:.! und: r !?
- 6. Unterschied zwischen like und Regex-Operator
- 7. Was ist der Unterschied zwischen .replace und -replace in Powershell?
- 8. Was ist der Unterschied zwischen diesen Regexen
- 9. Java und Android Regex Unterschied
- 10. Was ist der Unterschied zwischen Matcher.lookingAt() und find()?
- 11. Was ist der Unterschied zwischen `==` und `ist`?
- 12. Was ist der Unterschied zwischen \ 1 und $ 1 in einem Perl Regex?
- 13. Was ist der Unterschied zwischen tr /// und s /// bei Verwendung von Regex in Perl?
- 14. Regex-Substitution: Was ist der Unterschied zwischen $ und Wert (in Lambda-Ausdruck)?
- 15. Was ist der Unterschied zwischen einer Gruppe und einer Übereinstimmung in .NET RegEx?
- 16. Was ist der Unterschied hinter normalen Funktionsaufruf und pcall
- 17. Regex zwischen Leerraum und =
- 18. Was ist der Unterschied zwischen der Inline-Member-Funktion und der normalen Member-Funktion?
- 19. Was ist der Unterschied zwischen der Kakao-Touch-Klasse und der normalen Swift-Klasse?
- 20. Vim Regex Ersetzen
- 21. (g) vim ersetzen Regex
- 22. Was ist der Unterschied zwischen vim72 und vimfiles Ordner?
- 23. Vim Case-Agnostic Regex
- 24. Was ist der Unterschied zwischen Difftime und '-'?
- 25. Was ist der Unterschied zwischen $ und $$?
- 26. Was ist der Unterschied zwischen Verilog! und ~?
- 27. was ist der Unterschied zwischen [[], []] und [[]] * 2
- 28. Was ist der Unterschied zwischen/* ... */und/** ... */
- 29. Was ist der Unterschied zwischen `&` und `ref`?
- 30. Was ist der Unterschied zwischen $ (...) und `...`
Definieren Sie "normalen Regex". Jede Regex-Engine unterscheidet sich zumindest subtil von fast allen anderen. – sepp2k