2014-02-26 8 views
9

die folgenden Befehle vor:ungerades Verhalten mit Greedy Modifikatoren Innen Capture-Gruppen

text <- "abcdEEEEfg" 

sub("c.+?E", "###", text) 
# [1] "ab###EEEfg"       <<< OKAY 
sub("c(.+?)E", "###", text) 
# [1] "ab###EEfg"       <<< WEIRD 
sub("c(.+?)E", "###", text, perl=T) 
# [1] "ab###EEEfg"       <<< OKAY 

Die erste macht genau das, was ich erwarte, im Grunde nur der erste E. Die zweite Anpassung im Wesentlichen identisch mit dem ersten sein sollte, da Alles, was ich tue, ist das Hinzufügen einer einfangenden Gruppe (obwohl ich sie nicht verwende), aber aus irgendeinem Grund fängt sie ein extra E ein. Das heißt, es ist nicht vollständig gierig (dh wenn es wäre, hätte es alle gefangen Es). Noch seltsamer, es entspricht tatsächlich noch dem Muster, obwohl das sub Ergebnis das .+? Stück vortäuscht, das EE weggelassen wird, das nicht mehr durch den Rest des regulären Ausdrucks verglichen werden kann. Dies deutet darauf hin, dass bei der Berechnung der Länge des übereinstimmenden Unterausdrucks ein Offset-Problem auftritt und nicht bei der tatsächlichen Übereinstimmung.

Die letzte ist genau das gleiche, aber mit PCRE laufen, und das funktioniert wie erwartet.

Fehle ich etwas oder ist dieses Verhalten undokumentiert/fehlerhaft?

+0

Dies riecht wie ein Fehler in R. – nneonneo

+0

Posted als ** [ein Fehler] (https://github.com/laurikari/tre/issues/21) ** auf der tre GitHub-Seite. – BrodieG

Antwort

2

R verwendet libtre, Version 0.8. Für mehr Stabilität sollten Sie immer perl = TRUE verwenden.

Beachten Sie, dass

sub("c(.+?)E?", "###", text) 

funktioniert.

+0

Das habe ich immer gemacht, aber es gibt einige Dinge, die nicht mit dem Flag 'perl = T' implementiert wurden (insbesondere' regexec'). Mein tatsächlicher Fehler war aufgetreten, als ich 'regexec' (oder genauer gesagt, die' str_match_all'/etc. Werkzeuge in 'stringr', die darauf angewiesen sind) verwendet habe und ich war in ähnlicher Weise in der Lage, das Problem durch Hinzufügen von'. * 'Zu umgehen nach dem Muster, obwohl für das "sub" -Beispiel es offensichtlich nicht funktioniert. Niemand sonst hat bis zum Morgen mehr Informationen, die ich als Antwort nehme. Weißt du, ob es Pläne gibt, die Bibliothek zu aktualisieren? Sieht aus wie 0.8 ist seit 4 Jahren herum. – BrodieG

+0

Tatsächlich sieht die ** [TRE-Bibliothek wurde bereits aktualisiert] (http://cran.r-project.org/bin/windows/base/old/2.15.2/NEWS.R-2.15.2.html) ** (Suche nach TRE). – BrodieG

+0

Ich habe meine Antwort korrigiert, um das Update wiederzugeben. Es sieht nicht so aus, als würde die Entwicklung auf 'libtre' weitergehen. Es gibt einige offene Probleme, [1] (https://github.com/laurikari/tre/issues/11) von denen es um R geht. Ich denke, das sollte als ein Fehler für das R-Entwicklungsteam angesprochen werden. –