Entfliehen Sie mit einem doppelten Backslash
R behandelt Backslashes als Escape-Werte für Zeichenkonstanten . (... und reguläre Ausdrücke auch. Daher sind zwei Backslashes erforderlich, wenn ein Zeichenargument für ein Muster angegeben wird. Das erste ist eigentlich kein Zeichen, sondern macht das zweite zu einem Zeichen.) Sie können sehen wie sie verarbeitet werden mit cat
.
y <- "double quote: \", tab: \t, newline: \n, unicode point: \u20AC"
print(y)
cat(y)
Weiterführende Literatur: Wenn Sie einen Backslash mit einem Backslash in R umgehen, werden 2 Backslashes in einer Zeichenfolge erzeugt, nicht 1
Um Sonderzeichen in einem regulären Ausdruck zu verwenden, besteht die einfachste Methode normalerweise darin, sie mit einem Backslash zu maskieren. Wie oben erwähnt, muss der Backslash selbst maskiert werden.
grepl("\\[", "a[b")
Um Backslashes abzugleichen, müssen Sie die Escape-Taste verdoppeln, was zu vier Backslashes führt.
grepl("\\\\", c("a\\b", "a\nb"))
Das rebus
Paket enthält Konstanten für jedes der Sonderzeichen, damit Sie keine Schrägstriche eingeben müssen.
library(rebus)
OPEN_BRACKET
BACKSLASH
Weitere Beispiele finden Sie unter:
?SpecialCharacters
Ihr Problem kann folgendermaßen gelöst werden:
library(rebus)
grepl(OPEN_BRACKET, "a[b")
Bilden Sie eine Zeichenklasse
Sie können die Sonderzeichen auch in eckige Klammern setzen, um eine Zeichenklasse zu bilden .
grepl("[?]", "a?b")
Zwei der Sonderzeichen haben innerhalb der Zeichenklassen eine besondere Bedeutung: \
und ^
.
Backslash muss auch dann maskiert werden, wenn es sich innerhalb einer Zeichenklasse befindet.
grepl("[\\\\]", c("a\\b", "a\nb"))
Caret muss nur entkommen, wenn es sich direkt hinter der öffnenden eckigen Klammer befindet.
grepl("[ ^]", "a^b")
grepl("[\\^]", "a^b")
rebus
Sie können auch eine Zeichenklasse bilden.
char_class("?")
Verwenden Sie eine bereits vorhandene Zeichenklasse
Wenn Sie alle Satzzeichen abgleichen möchten, können Sie die [:punct:]
Zeichenklasse verwenden.
grepl("[[:punct:]]", c("//", "[", "(", "{", "?", "^", "$"))
stringi
Ordnet dies zur Interpunktion der allgemeinen Unicode-Kategorie zu, sodass sich sein Verhalten geringfügig unterscheidet.
stri_detect_regex(c("//", "[", "(", "{", "?", "^", "$"), "[[:punct:]]")
Sie können auch die plattformübergreifende Syntax für den Zugriff auf eine UGC verwenden.
stri_detect_regex(c("//", "[", "(", "{", "?", "^", "$"), "\\p{P}")
Verwenden Sie \ Q \ E Escapezeichen
Wenn Sie Zeichen zwischen \\Q
und platzieren, werden sie von \\E
der Engine für reguläre Ausdrücke buchstäblich und nicht als reguläre Ausdrücke behandelt.
grepl("\\Q.\\E", "a.b")
rebus
Mit dieser Option können Sie Literalblöcke mit regulären Ausdrücken schreiben.
literal(".")
Verwenden Sie keine regulären Ausdrücke
Reguläre Ausdrücke sind nicht immer die Antwort. Wenn Sie mit einer festen Zeichenfolge übereinstimmen möchten, können Sie beispielsweise Folgendes tun:
grepl("[", "a[b", fixed = TRUE)
stringr::str_detect("a[b", fixed("["))
stringi::stri_detect_fixed("a[b", "[")
cat
, um den Effekt des Entweichens mit Backslashes zu sehen, leuchtet auf.\\Q
und\\E
Tipp. Ich habe nie bemerkt, dass es begraben wurde?base::regex
.stringr::str_detect("a[b", fixed("["))
Ich denke, der einfachste Weg, um die Charaktere wie zusammenzubringen
verwenden Zeichenklassen aus R. Beachten Sie Folgendes, um Spaltenüberschriften aus einer Datendatei zu entfernen, die Leerzeichen und Satzzeichen enthalten kann:
> library(stringr) > colnames(order_table) <- str_replace_all(colnames(order_table),"[:punct:]|[:space:]","")
Dieser Ansatz ermöglicht es uns, Zeichenklassen so zu kennzeichnen, dass sie mit Interpunktionszeichen übereinstimmen, zusätzlich zu Leerzeichen, mit denen Sie normalerweise entkommen müssten, um sie
\\
zu erkennen.?regexp
Weitere Informationen zu den Charakterklassen finden Sie in diesem Cheatsheet unten. Sie können auch eingeben, um weitere Informationen dazu zu erhalten.https://www.rstudio.com/wp-content/uploads/2016/09/RegExCheatsheet.pdf
quelle