Warum klagen meine Perl Regex über "Unmatched" in Regex "?

8
%Vor%

$ Titel kann eine Reihe von Titeln sein, die von Präsident, MD, COO, CEO, ... reichen

$ ersetzen kann (Aktionär), (Eigentümer) oder dergleichen sein.

Ich bekomme diesen Fehler immer wieder. Ich habe nach falsch ausbalanciertem '(', ')', keinem Würfel gesucht: (

%Vor%

Wenn Sie mir sagen könnten, was die Regex macht, wäre das großartig. Streicht es diese Symbole? Danke Leute!

    
ThinkCode 16.03.2010, 22:02
quelle

3 Antworten

14

Wenn die Variable $ replace Regex-Metazeichen enthalten kann, sollten Sie sie in \Q...\E

umbrechen %Vor%

Um Jeffrey Friedls Mastering Regular Expressions zu zitieren

  

Literal Textspanne Die Folge \ Q "Anführungszeichen" regex Metazeichen (dh, setzt einen Backslash vor ihnen) bis zum Ende der Zeichenfolge oder bis zu einer \ E Sequenz.

    
Paul Creasey 16.03.2010, 22:11
quelle
5

Wie bereits erwähnt, werden diese Interpunktionssymbole entfernt, gefolgt vom Inhalt von $ replace, dann von mehr Interpunktionssymbolen, und dass es fehlschlägt, weil $ replace selbst eine nicht passende Klammer enthält.

Aber ein paar andere allgemeine Regex-Sachen: Erstens, anstatt alles zusammen zu OR-en (und das ist nur um die Logik und das Tippen zu vereinfachen), würde ich sie in einer Zeichenklasse zusammenhalten. passender [\s^,\/;\|] ist möglicherweise weniger fehleranfällig und fingerfreundlich.

Zweitens, verwenden Sie keine Gruppierung, Klammer eine Menge von () , es sei denn, Sie meinen es wirklich. Dadurch wird die erfasste Zeichenkette in Erfassungspuffer platziert und der Overhead in der Regex-Engine wird erhöht. Per perldoc perlre :

WARNUNG: Sobald Perl sieht, dass Sie eines von $ & amp; , $ 'oder $' irgendwo im Programm, es muss sie für jede Musterübereinstimmung zur Verfügung stellen. Dies kann Ihr Programm erheblich verlangsamen. Perl verwendet den gleichen Mechanismus, um $ 1, $ 2 usw. zu produzieren, also zahlen Sie auch einen Preis für jedes Muster, das auffangende Klammern enthält. Quelle

Sie können das umgehen, indem Sie einfach ?: zu den Klammern hinzufügen:

(?:[\s^,\/;\|])

Bearbeiten: Nicht, dass Sie nicht erfassende Gruppierungen in dieser Instanz benötigen, aber sie befinden sich bereits in der Originalregex.

    
Marc Bollinger 16.03.2010 22:17
quelle
3

Offenbar enthält Ihre Variable $replace die Zeichenfolge Owner) , nicht (Owner) .

%Vor%

Ausgabe:

%Vor% %Vor%

Ausgabe:

%Vor%     
Mark Byers 16.03.2010 22:06
quelle

Tags und Links