Wie kann ich Perl5 / PCRE in Perl 6 regex übersetzen?

8

Nur um das aus dem Weg zu räumen, würde ich index , substr oder ähnliches verwenden, da sie die offensichtliche Lösung für meinen speziellen Fall sind, aber ich mache ein grammar und so kann ich nur regex verwenden. : (

Der Ratschlag, Perl5 / PCRE-Regex in Perl6-Regex zu übersetzen, ist jedenfalls ein guter SO-Inhalt, weil Perl 6 an Popularität gewinnt und seine Regex-Engine sehr unterschiedlich ist.

Hier ist eine Regex, die nur mit einer Zeichenfolge übereinstimmt, die keine der angegebenen Zeichen enthält.
( probieren Sie es hier .)

%Vor%

Offensichtlich funktioniert es in Perl 6 aus verschiedenen Gründen nicht.

Aus dem oben genannten Grund möchte ich dies in Perl 6 verwenden. Hier habe ich versucht, es zu übersetzen, basierend auf CTRL-F Die perl6 Regex-Dokumente für non capturing und negative lookahead :

%Vor%

Und der Zusammenbruch (denke ich?):

%Vor%

Ich implementiere das wie my regex not-in { ... } und benutze es dann wie /^<not-in>$/ . Es gibt jedoch Nil für jede Zeichenfolge zurück, was bedeutet, dass es nicht richtig funktioniert.

Ich konnte nicht das Äquivalent von Ссылка für Perl 6 finden, also ist es nicht so einfach damit herumzuspielen sei mit Perl 5.

Wie übersetze ich das zu Perl 6?

    
cat 27.01.2016, 19:23
quelle

3 Antworten

8

Kurze Antwort

Regex, um nur Strings zu finden, die keine Schrägstriche enthalten: /^ <-[ / ]>* $/

/ Anfang des regulären Ausdrucks
^ Anfang des Strings

<-[ öffne negative Zeichenklasse (ohne - , dies wäre eine normale Zeichenklasse)
/ Zeichen, die die Klasse nicht abgleicht
]> schließt Zeichenklasse

* Null oder mehr "Kopien" dieser Klasse
$ Ende der Zeichenkette
/ Ende des regulären Ausdrucks

Leerzeichen in Perl 6 Regexes werden standardmäßig ignoriert.

Vollständige Antwort

Wenn ich es richtig verstehe, versuchen Sie nur, eine Zeichenfolge zu finden, die keinen Schrägstrich enthält. In diesem Fall verwenden Sie einfach eine negative Zeichenklasse.

Eine Zeichenklasse, die a und b enthält, würde folgendermaßen geschrieben: <[ab]>

Eine Zeichenklasse, die alles außer a oder b enthält, würde folgendermaßen geschrieben: <-[ab]>

Eine Zeichenklasse, die alles außer / enthält, würde folgendermaßen geschrieben: <-[ / ]> und die Regex, um sicherzustellen, dass kein Zeichen in einem String einen Schrägstrich enthält, wäre /^ <-[ / ]>* $/ .

Dieser Code stimmt überein, wenn eine Zeichenfolge keinen Schrägstrich enthält und nicht übereinstimmt, wenn sie einen Schrägstrich enthält:

%Vor%

Die bevorzugte Methode, um nur den Ausschluss eines Zeichens zu überprüfen, ist die Verwendung der Funktion index . Wenn Sie jedoch mehr als ein Zeichen ausschließen möchten, verwenden Sie einfach die negative Zeichenklasse mit allen Zeichen, die Sie nicht in der Zeichenfolge finden möchten.

    
Christopher Bottoms 27.01.2016, 21:17
quelle
7

Die literale Übersetzung Ihrer ursprünglichen regex ^(?:(?!\/).)*$ in die Perl 6-Syntax lautet:

%Vor%

Es ist einfach genug für eine direkte Übersetzung.

  • Ersetzen Sie (?: ... ) mit [ ... ]
  • Ersetzen Sie (?! ... ) mit <!before ... >
  • Nehmen Sie standardmäßig den x -Modifikator an

Alles andere bleibt in diesem Beispiel gleich.

Ich habe es mit einem einfachen Test getestet:

%Vor%     
Lucas Trzesniewski 27.01.2016 20:47
quelle
1

Nur um das aus dem Weg zu räumen

Ihre Frage beginnt mit:

  

Um das aus dem Weg zu räumen, würde ich index, substr oder ähnliches verwenden, da sie die offensichtliche Lösung für meinen speziellen Fall sind, aber ich mache eine Grammatik und kann daher nur Regex verwenden. : (

Pedant sein, können Sie das tun. Tatsächlich können Sie beliebigen Code in Perl-Regexes einbetten.

Ein typisches Beispiel für Perl 6:

%Vor%

Das \d**1..3 -Bit entspricht 1 bis 3 Dezimalstellen. Die (...) parens, die dieses Bit umgeben, weisen Perl 6 an, die Übereinstimmung in der speziellen Variablen $ / .

Das <?{ ... }> -Bit ist eine Code-Assertion. Wenn der Code wahr zurückgibt, wird die Regex fortgesetzt. Wenn nicht, läuft es zurück oder schlägt fehl.

Verwendung von index usw. (in diesem Fall habe ich substr-eq ) in einem Regex ausgewählt ist umständlich und wahrscheinlich wahnsinnig. Aber es ist machbar:

%Vor%

wird angezeigt:

%Vor%

(Der Aufruf von .orig für ein Match-Objekt gibt die ursprüngliche Zeichenfolge zurück, mit der verglichen wurde oder wird. Der Aufruf von .to gibt den Index innerhalb der ursprünglichen Zeichenfolge zurück, der der Übereinstimmung entspricht oder erreicht wurde Bisher; "abc" ~~ / a { say $/.orig, $/.to } bc / zeigt abc1 an.)

    
raiph 31.01.2016 21:51
quelle

Tags und Links