Wie soll ich mit Regex-Features umgehen, die mit "warning" wie "(? {Code})", "(?? {code})" oder "Special Backtracking Control Verbs" gekennzeichnet sind? Wie ernst soll ich die Warnungen nehmen?Wie soll ich mit Regex-Funktionen umgehen, die mit "Warnung" gekennzeichnet sind?
Antwort
Ich glaube irgendwie, dass sie hier sind, um zu bleiben, auf die eine oder andere Weise - vor allem Code entkommt. Code Escapes begleiten uns seit mehr als einem Jahrzehnt.
Die Unheimlichkeit von ihnen - dass sie Code in unvorhergesehenen Wegen aufrufen können - wird von use re "eval"
betreut. Auch der Regex-Matcher war bis 5.12 IIRC nicht relevant, was ihre Nützlichkeit einschränken könnte.
Die string-eval-Version, (??{ code })
, war früher der einzige Weg, eine Rekursion durchzuführen, aber seit 5.10 haben wir einen viel besseren Weg, dies zu tun; Benchmarking der Geschwindigkeitsunterschiede zeigt, dass der Evaluierungsweg in den meisten Fällen viel langsamer ist.
Ich verwende meistens die Block-Evaluierungsversion, (?{ code})
, um Debugging hinzuzufügen, was bei einer anderen Granularität als use re "debug"
geschieht. Es hat mich vage gestört, dass der Rückgabewert von der Block-Evaluierungsversion nicht verwendbar war, bis ich feststellte, dass war. Sie musste es einfach als Test Teil eines bedingten Muster verwenden, wie dieses Muster für die Prüfung, ob eine Zahl wurde von Ziffern aus, die auf der rechten Seite durch eine jede Position abnehmend wurden:
qr{
^(
(\p{Decimal_Number})
(?(?= (\d)) | $)
(?(?{ ord $3 == 1 + ord $2 }) (?1) | $)
) $
}x
Bevor ich heraus Ich hätte das so geschrieben:
was viel weniger effizient ist.
Die Backtracking-Kontrollverben sind neuer. Ich benutze sie hauptsächlich, um alle möglichen Permutationen eines Matches zu erhalten, und das erfordert nur (*FAIL)
. Ich glaube, es ist die Funktion, die besonders "hoch experimentell" markiert ist. Diese sind erst seit 5.10 bei uns.
- 1. Wie soll ich mit zusammengesetzten Schlüsseln in .NET-Objekten umgehen?
- 2. Wie soll ich mit C-Strings in D umgehen?
- 3. Wie soll ich Remote Logging mit Systemd umgehen?
- 4. Wie kann ich mit dieser Warnung umgehen: Hash-Mismatch?
- 5. Wie mit Global-Konstruktor Warnung in Clang umgehen?
- 6. Warum werden Variablen, die mit "our" gekennzeichnet sind, in Dateien angezeigt?
- 7. Was sind die Grails-Bugs, mit denen Entwickler umgehen müssen?
- 8. Verfolgen der Verwendung von Funktionen, die als veraltet gekennzeichnet sind
- 9. Ich weiß nicht, wie ich mit dem Fehler in input.getaxis ("Vertical") umgehen soll?
- 10. Wie kann ich mit großen Matrizen umgehen?
- 11. Table ‚./mysql/proc‘ als abgestürzt gekennzeichnet und soll
- 12. Wie soll ich mit der Internationalisierung von Display-Strings für FHIR-Beobachtungen umgehen?
- 13. Wie kann ich mit klassischem ASP umgehen?
- 14. Wie kann ich in Firefox/IE7 mit Zahlen umgehen, die größer als 17 Ziffern sind?
- 15. Wie ich mit meinem Socket umgehen kann
- 16. Wie soll ich mit erwarteten Fehlern umgehen? z.B. "username exists exists"
- 17. Wie soll ich @types mit Typoskript 2
- 18. Wie man mit Bildern umgehen kann, die für den GPU Speicher mit OpenCL zu groß sind
- 19. Wie soll ich mit der Bestellung von Daten umgehen und gleichzeitig flexibel für zukünftige Änderungen bleiben?
- 20. Wie soll ich mit Ziffern aus unterschiedlichen UNICODE-Ziffern in derselben Zeichenfolge umgehen?
- 21. Wie soll ich HTML-Codierung eines Umrisses mit römischen Ziffern, Zahlen, Alphabuchstaben umgehen?
- 22. Wie soll ich mit einem Modellattribut umgehen, das nicht den Anforderungsparametern entspricht?
- 23. Benutzerdefiniertes Streaming zum Lesen von BLOBS aus MS-SQL - Wie soll ich mit der Verbindung umgehen?
- 24. Wie soll ich mit Einträgen umgehen, wenn der Benutzer gelöscht wird?
- 25. Wie soll ich mit geheimen Werten in einem Projekt in der Quellcodeverwaltung umgehen?
- 26. Wie mit Java-Threads umgehen
- 27. Wie soll ich Swagger mit Hapi verwenden?
- 28. Wie kann ich Sonderzeichen in einem NSString mit RegexKitLite umgehen?
- 29. Wo ich mit einer Exception umgehen kann
- 30. Wie kann ich mit russischem Text in Perl umgehen?
(? {Ord $ 3 == 1 + ord $ 2}): stoppt dies die Regex, wenn es nicht wahr ist? –
@sid_com: Es prüft auf wahr, nimmt den '(? 1)' Zweig wenn ja und den '$' wenn nicht. – tchrist