program tip

정규식에서 \ ^ $.? * | + () [{와 같은 특수 문자를 어떻게 처리합니까?

radiobox 2020. 12. 5. 09:33
반응형

정규식에서 \ ^ $.? * | + () [{와 같은 특수 문자를 어떻게 처리합니까?


나는 일치시킬 정규 표현식의 특수 문자를 , \^$.?*|+()[{. 나는 시도했다 :

x <- "a[b"
grepl("[", x)
## Error: invalid regular expression '[', reason 'Missing ']''

(동등하게 stringr::str_detect(x, "[")또는 stringi::stri_detect_regex(x, "[").)

값을 두 배로 늘려도 작동하지 않습니다.

grepl("[[", x)
## Error: invalid regular expression '[[', reason 'Missing ']''

백 슬래시도 사용하지 않습니다.

grepl("\[", x)
## Error: '\[' is an unrecognized escape in character string starting ""\["

특수 문자는 어떻게 일치합니까?


이것의 복제물로 닫을 수있을만큼 오래되고 잘 작성된 질문에서 이것의 몇 가지 특별한 경우 :
R 정규식의 이스케이프 된 기간 R
에서 물음표를 이스케이프하는 방법?
정규식에서 파이프 ( "|") 이스케이프


이중 백 슬래시로 이스케이프

R은 백 슬래시를 문자 상수의 이스케이프 값으로 처리합니다 . (... 정규 표현식도 마찬가지입니다. 따라서 패턴에 대한 문자 인수를 제공 할 때 두 개의 백 슬래시가 필요합니다. 첫 번째는 실제로 문자가 아니라 두 번째를 문자로 만듭니다.) 을 사용하여 처리되는 방법 cat.

y <- "double quote: \", tab: \t, newline: \n, unicode point: \u20AC"
print(y)
## [1] "double quote: \", tab: \t, newline: \n, unicode point: €"
cat(y)
## double quote: ", tab:    , newline: 
## , unicode point: €

추가 정보 : R에서 백 슬래시를 사용하여 백 슬래시를 이스케이프하면 문자열에 1이 아닌 2 개의 백 슬래시가 생성됩니다.

정규식에서 특수 문자를 사용하는 가장 간단한 방법은 일반적으로 백 슬래시로 이스케이프하는 것이지만 위에서 언급했듯이 백 슬래시 자체를 이스케이프해야합니다.

grepl("\\[", "a[b")
## [1] TRUE

백 슬래시를 일치 시키려면 이중 이스케이프를 수행해야하므로 백 슬래시가 4 개가됩니다.

grepl("\\\\", c("a\\b", "a\nb"))
## [1]  TRUE FALSE

rebus특수 문자의 각 당신에게 오타 슬래시를 저장하는 패키지는 상수가 포함되어 있습니다.

library(rebus)
OPEN_BRACKET
## [1] "\\["
BACKSLASH
## [1] "\\\\"

더 많은 예는 다음을 참조하십시오.

?SpecialCharacters

다음과 같이 문제를 해결할 수 있습니다.

library(rebus)
grepl(OPEN_BRACKET, "a[b")

캐릭터 클래스 형성

특수 문자를 대괄호로 묶어 문자 클래스를 구성 할 수도 있습니다 .

grepl("[?]", "a?b")
## [1] TRUE

특수 문자 중 두 개는 문자 클래스 내에서 특별한 의미를 갖습니다 : \^.

백 슬래시는 문자 클래스 내에 있더라도 여전히 이스케이프되어야합니다.

grepl("[\\\\]", c("a\\b", "a\nb"))
## [1]  TRUE FALSE

캐럿은 여는 대괄호 바로 뒤에있는 경우에만 이스케이프하면됩니다.

grepl("[ ^]", "a^b")  # matches spaces as well.
## [1] TRUE
grepl("[\\^]", "a^b") 
## [1] TRUE

rebus 또한 문자 클래스를 형성 할 수 있습니다.

char_class("?")
## <regex> [?]

기존 문자 클래스 사용

모든 구두점을 일치 시키려면 [:punct:]문자 클래스를 사용할 수 있습니다 .

grepl("[[:punct:]]", c("//", "[", "(", "{", "?", "^", "$"))
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE

stringi 구두점을 위해 유니 코드 일반 범주에 매핑하므로 동작이 약간 다릅니다.

stri_detect_regex(c("//", "[", "(", "{", "?", "^", "$"), "[[:punct:]]")
## [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE

You can also use the cross-platform syntax for accessing a UGC.

stri_detect_regex(c("//", "[", "(", "{", "?", "^", "$"), "\\p{P}")
## [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE

Use \Q \E escapes

Placing characters between \\Q and \\E makes the regular expression engine treat them literally rather than as regular expressions.

grepl("\\Q.\\E", "a.b")
## [1] TRUE

rebus lets you write literal blocks of regular expressions.

literal(".")
## <regex> \Q.\E

Don't use regular expressions

Regular expressions are not always the answer. If you want to match a fixed string then you can do, for example:

grepl("[", "a[b", fixed = TRUE)
stringr::str_detect("a[b", fixed("["))
stringi::stri_detect_fixed("a[b", "[")

I think the easiest way to match the characters like

\^$.?*|+()[

are using character classes from within R. Consider the following to clean column headers from a data file, which could contain spaces, and punctuation characters:

> library(stringr)
> colnames(order_table) <- str_replace_all(colnames(order_table),"[:punct:]|[:space:]","")

This approach allows us to string character classes to match punctation characters, in addition to whitespace characters, something you would normally have to escape with \\ to detect. You can learn more about the character classes at this cheatsheet below, and you can also type in ?regexp to see more info about this.

https://www.rstudio.com/wp-content/uploads/2016/09/RegExCheatsheet.pdf

참고URL : https://stackoverflow.com/questions/27721008/how-do-i-deal-with-special-characters-like-in-my-regex

반응형