문제
9 개 이상의 역 번호를 가진 GSUB를 사용하는 방법은 무엇입니까? 아래 예제의 출력이 "e, g, i, j, o"가 될 것으로 기대합니다.
> test <- "abcdefghijklmnop"
> gsub("(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)", "\\5, \\7, \\9, \\10, \\15", test, perl = TRUE)
[1] "e, g, i, a0, a5"
해결책
보다 R 언어를 가진 정규 표현:
역 번호등을 사용할 수 있습니다
\1
~을 통해\9
대체 텍스트로 텍스트가 일치하는 텍스트로 캡처 그룹. 전체 일치에 대한 교체 텍스트 토큰이 없습니다. 전체 정규를 캡처 그룹에 배치 한 다음 사용하십시오.\1
.
그러나 PCRE를 사용하면 사용할 수 있어야합니다 명명 된 그룹. 그래서 시도하십시오 (?P<
name
>
regex
)
Groupd 이름 지정 및 (?P=
name
)
역전으로.
다른 팁
사용 strsplit
대신에:
test <- "abcdefghijklmnop"
strsplit(test, "")[[1]][c(5, 7, 9, 10, 15)]
10 우리는 역전 0으로 이해하고 1의 숫자로 이해할 것이라는 것은 나의 이해였습니다. 9는 최대라고 생각합니다.
그만큼 stri_replace_*_regex
에서의 기능 Stringi 패키지에는 그러한 제한 사항이 없습니다.
library("stringi")
stri_replace_all_regex("abcdefghijkl", "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", "$10$1$11$12")
## [1] "jakl"
1으로 첫 번째 캡처 그룹을 따르려면 예를 들어
stri_replace_all_regex("abcdefghijkl", "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", "$10$1$1\\1$12")
## [1] "jaa1l"
9 번의 뒷면에 대한이 제한은 다음과 같습니다 sub()
그리고 gsub()
기능이 아닌 함수 grep()
그리고 같은. R에서 9 개 이상의 역사를 지원하는 지원은 PCRE 정규식을 사용하는 것을 의미합니다 (예 : perl=TRUE
논쟁); 그러나이 옵션을 사용하더라도 sub () 및 gsub () 함수는이를 지원하지 않습니다.
R 문서는이 시점에서 명시 적입니다. ?regexp
There can be more than 9 backreferences (but the replacement in sub can
only refer to the first 9).
또한 명명 된 캡처 그룹을 사용 하여이 제한을 우회한다는 아이디어는 지명 된 캡처 그룹이 sub () 함수로 지원되지 않기 때문에 실패해야합니다.
regexpr and gregexpr support ‘named capture’. If groups are named,
e.g., "(?<first>[A-Z][a-z]+)" then the positions of the matches are also
returned by name. (Named backreferences are not supported by sub.)