Ihr Muster enthält zwei Alternativen, ^X\\.[3-9]{1}
Streichhölzer X.3
zu X.9
und ^X\\.[0-9]{2}
Matches X.00
-X.99
. Das ist nicht was du suchst.
Um
grep("^X\\.(?:[3-9]|1[0-3])\\b", x)
Oder nur X.3
-X.13
, verwenden Sie zu finden in jeder rechten Seite Kontext (kein Wortgrenze auf der rechten Seite) entsprechen:
grep("^X\\.(?:1[0-3]|[3-9])", x)
Siehe the regex demo.
Oder, wenn ein Brief oder _
nach der Zahl sein kann, ersetzen \\b
mit (?!\\d)
und sicher sein, perl=TRUE
an die grep
Funktion zu übergeben, da die Look-Ahead-Konstrukte, die durch den Standard TRE Regex-Engine nicht unterstützt werden:
grep("^X\\.(?:[3-9]|1[0-3])(?!\\d)", x, perl=TRUE)
Siehe this regex demo.
Ein weiterer Punkt: die ^
caret verwendet werden, um den Beginn der Zeichenfolge zu bezeichnen. Wenn Sie die Teil eine beliebige Stelle innerhalb der Zeichenfolge übereinstimmen bedeuten, entfernen oder ersetzen mit \\b
X
übereinstimmen, die nicht mit _
, Buchstaben oder Ziffern vorangestellt ist (siehe noch another regex demo).
Einzelheiten
^
- Beginn der Zeichenfolge
X\\.
- ein X.
Teilzeichenfolge
(?:
- Beginn einer Gruppe:
1[0-3]
- 1
mit einer Ziffer gefolgt von 0
t o 3
|
- oder
[3-9]
- 3 zu 9
)
- Ende der Nicht-Erfassung Gruppe
\\b
- eine Wortgrenze
wie etwa 'val <- as.numerisch (gsub ("^ X \\.", "", x)); was (3 <= v & v <= 13) '...? –
Die immer redundante '{1}' loszuwerden wäre ein guter Anfang. – CAustin
Entschuldigung, mein Vorschlag funktioniert möglicherweise nicht mit den "vielen anderen Sachen" ... –