2017-11-26 1 views
1

In haben folgenden Code:Warum funktioniert dieser scheinbar korrekte Regex in Rascal nicht korrekt?

set[str] noNnoE = { v | str v <- eu, (/\b[^eEnN]*\b/ := v) }; 

Ziel aus einer Reihe von Zeichenketten zu filtern ist (so genannte ‚EU‘), diese Zeichenfolgen, die keine ‚e‘ oder ‚n‘ in ihnen (sowohl Groß- und Kleinbuchstaben). Der reguläre Ausdruck Ich habe zur Verfügung gestellt:

/\b[^eEnN]?\b/ 

scheint, wie es sollte zu arbeiten, wenn ich es versuchen in an online regex-tester aus.

Wenn es draußen in der Rascel Terminal versucht, es nicht zu funktionieren scheint:

rascal>/\b[^eEnN]*\b/ := "Slander"; 
bool: true 

ich kein Spiel erwartet. Was fehlt mir hier? Ich verwende die neueste (stabile) Rascal-Version in Eclipse Oxygen1a.

Antwort

2

Eigentlich gibt der Online-Regex-Tester die gleiche Übereinstimmung, die wir geben. Sie können das Spiel wie folgt aussehen:

if (/<w1:\b[^eEnN]?\b>/ := "Slander") 
    println("The match is: |<w1>|"); 

Dies wird die angepassten String w1 zuweisen und sie dann zwischen den vertikalen Balken gedruckt wird, unter der Annahme, das Spiel erfolgreich ist (wenn es nicht der Fall ist, gibt sie falsch, so dass die Körper des If wird nicht ausgeführt).

The match is: || 

Die Online-Regex Tester sagt das Gleiche: Wenn Sie dies tun, werden Sie ein Spiel auf den leeren String zurück

Match 1 
Full match 0-0 '' 

Wenn Sie dies wollen, um zu verhindern, können Sie zwingen, mindestens ein Vorkommen der Zeichen, die Sie suchen, indem Sie eine + verwenden, im Vergleich zu einem ?:

rascal>/\b[^eEnN]+\b/ := "Slander"; 
bool: false 

Beachten Sie, dass Sie auch die Regex Fall INSEN machen sitive durch folgende mit einem i, etwa so:

/\b[^en]+\b/i 

Dies kann es leichter zu schreiben, wenn Sie mehrere Zeichen in der Zeichenklasse hinzufügen müssen.

+0

Danke! Du hast absolut recht. Meine Regex war am Anfang falsch. –

Verwandte Themen