문제

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"

에 따르면 이 지역, Back References 10 ~ 99는 일부 언어에서 작동하지만 대부분은 그렇지 않습니다.

작동하는 것으로보고 된 사람들은입니다

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.)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top