2016-08-19 7 views
0

Большинство функций stringr - это всего лишь обертки вокруг соответствующих функций stringi. str_replace_all - один из тех. Однако мой код не работает с stri_replace_all, соответствующей функцией stringi.с использованием захваченных групп в str_replace/stri_replace - stringi vs stringr

Я пишу быстрое регулярное выражение для преобразования (подмножество) верблюжьего случая на разнесенные слова.

Я очень озадачен, почему это работает:

str <- "thisIsCamelCase aintIt" 
stringr::str_replace_all(str, 
         pattern="(?<=[a-z])([A-Z])", 
         replacement=" \\1") 
# "this Is Camel Case ain't It" 

И это не делает:

stri_replace_all(str, 
       regex="(?<=[a-z])([A-Z])", 
       replacement=" \\1") 
# "this 1s 1amel 1ase ain't 1t" 
+0

Одним из вариантов было бы 'stri_replace_all (строка, регулярное выражение = "(? <= [А-г]) (? = [A-Z])", замена =» «)' – akrun

ответ

5

Если вы посмотрите на источник для stringr::str_replace_all you'l Я вижу, что он вызывает fix_replacement(replacement) для преобразования ссылок группы захвата \\# в $#. Но помощь на stringi:: stri_replace_all также ясно показывает, что вы используете $1, $2 и т. Д. Для групп захвата.

str <- "thisIsCamelCase aintIt" 
stri_replace_all(str, regex="(?<=[a-z])([A-Z])", replacement=" $1") 
## [1] "this Is Camel Case aint It" 
0

Ниже вариант должен возвращать тот же результат в обоих случаях.

pat <- "(?<=[a-z])(?=[A-Z])" 
str_replace_all(str, pat, " ") 
#[1] "this Is Camel Case aint It" 
stri_replace_all(str, regex=pat, " ") 
#[1] "this Is Camel Case aint It" 

Согласно справочной странице по ?stri_replace_all, есть примеры, которые свидетельствуют о $1, $2 используются для замены

stri_replace_all_regex('123|456|789', '(\\p{N}).(\\p{N})', '$2-$1') 

Таким образом, он должен работать, если мы заменим \\1 с $1

stri_replace_all(str, regex = "(?<=[a-z])([A-Z])", " $1") 
#[1] "this Is Camel Case aint It"