2016-09-06 3 views
2

Ich brauche die Fähigkeit, Gruppen in regulären Ausdrücken mit Namen in r zu erfassen. Ich teste den Code, der auf dieser Seite [Rd] Named capture in regexp erklärt wird und das Beispiel funktioniert ohne Problem. Ich versuche, diesen Code anzupassen, um einfache reguläre Ausdrücke zu lösen.Named Capture in Regexp

(xxxx)(?<id>\w{4})(?<number>\d{5}) 

Weitere Details finden Sie den Code here

ich versuche, es zu tun in r

regex = "(xxxx) (?<id>[0-9A-Za-z]{4}) (?<number>[0-9]{5})" 
notable = "xxxxcn0700814" 
regexpr(regex,notable,perl = TRUE) 

und es war meine Ausgabe für diesen Code

[1] -1 
attr(,"match.length") 
[1] -1 
attr(,"useBytes") 
[1] TRUE 
attr(,"capture.start") 
     id number 
[1,] -1  -1 -1 
attr(,"capture.length") 
     id number 
[1,] -1  -1 -1 
attr(,"capture.names") 
[1] ""  "id" "number" 

Ich kann sehen, Was ist das Problem damit, weil dieser Code dem Code der Webseite ähnlich ist?

Vielen Dank im Voraus

+0

Also was genau ist das Problem hier? Ich sehe die erfassten Namen in der Ausgabe. Offenbar haben Sie Leerzeichen in Ihrem regulären Ausdruck, aber nicht in Ihrem Ziel. Ist das das "Problem"? – MrFlick

+1

Fügen Sie '(? X)' am Muster hinzu oder entfernen Sie Leerzeichen aus dem Muster. –

Antwort

2

Wenn Sie das Leerzeichen in der PCRE regex Formatierung, benutzen Sie einfach den (?x) Inline-Modifikator machen wollen: die R online demo

regex = "(?x)(xxxx) (?<id>[0-9A-Za-z]{4}) (?<number>[0-9]{5})" 
      ^^^^ 

sehen, wenn Sie vergleichen wollen Ein Literalraum mit diesem Modifikator, Sie müssen es entkommen oder innerhalb einer Zeichenklasse verwenden. Wenn Sie ein beliebiges Leerzeichen benötigen, verwenden Sie \s Kurzschrift.

Wenn Sie nicht alle brauchen diese „Verhübsch-Schlechterung“ stuff, entfernen Sie einfach die Räume von Ihrem Muster, da ohne (?x) sie sind sinnvoll:

regex = "(xxxx)(?<id>[0-9A-Za-z]{4})(?<number>[0-9]{5})" 

Hinweis die wörtliche # Symbol auch entgangen sein, um einen buchstäblichen zu bezeichnen # Symbol. Leerzeichen innerhalb von Zeichenklassen ([...]) werden ebenfalls als Literal-Leerzeichen behandelt, und Sie können (?#:...) Kommentare innerhalb des PCRE-Regex-Musters mit dem Modifikator (?x) verwenden.