2016-03-26 1 views
1

Ich versuche, nicht einfangende Gruppen mit der str_extract Funktion aus dem stringr Paket zu verwenden. Hier ein Beispiel:Regex mit nicht einfangenden Gruppe mit Stringr in R

library(stringr) 
txt <- "foo" 
str_extract(txt,"(?:f)(o+)") 

Das gibt

"foo" 

, während ich es erwarten in diesem Beitrag nur

"oo" 

wie zurückzukehren: https://stackoverflow.com/a/14244553/3750030

Wie verwende ich nicht -Erfassung von Gruppen in R, um den Inhalt der Gruppen aus dem zurückgegebenen Wert zu entfernen, während er für verwendet wird zusammenpassen?

+0

Versuchen 'str_extract (txt "(<= f) (o +)?")' – akrun

Antwort

3

Wenn Sie Regex (?:f)(o+) verwenden, wird dies nicht Capture, aber es wird sicher übereinstimmen.

Welche Aufnahmeeinrichtung ist Speicherung im Speicher für Rückverweise, so dass sie für eine wiederholte Spiel in derselben Saite verwendet werden kann oder eingefangen Zeichenfolge ersetzt wird.

wie in diesem Beitrag: https://stackoverflow.com/a/14244553/3750030

Sie falsch verstanden, dass die Antwort. Non-Capturing Gruppen bedeutet nicht Non-Matching. Es ist in $1 (Gruppe 1) erfasst, da es keine Gruppe davor gibt.

Wenn Sie möchten Nur Spiel B gefolgt nehme von A dann sollten Sie positive lookbehind wie folgt verwenden.

Regex:(?<=f)(o+)

Erläuterung:

  • (?<=f) Dies wird sich für f vorhanden hinter dem folgenden Token sein, aber wird nicht überein.

  • (o+) Dies wird passen und Capture als Gruppe (hier in $ 1), wenn vorherige Bedingung erfüllt ist.

Regex101 Demo

+2

FYI: einfangenden Gruppen sind unzugänglich mit 'str_extract'. Verwenden Sie stattdessen 'str_match'. In diesem Fall ist '(? <= F) o +' genug. –

+0

Jetzt kaufen! Danke für die ausführliche Erklärung! – user3750030