2016-08-09 5 views
1

Я использую функцию str_replace в пакете stringr в R. Я хочу, чтобы заменить подстроку между PARTITIONED BY и ЗАПОМНЕННАЯ ASрегулярное выражение, строка матч, который содержит разрыв строки с lookaroud str_replace в R

Эти команды работают

my_string="esrhjg erguhg rziughrtPARTITIONED BY hzueirghf zreeuifh iuehg reuhg riutghSTORED ASiugh oer hfz" 
p="(?<=PARTITIONED BY).*(?=STORED AS)" 
str_replace(my_string,p,"TO REPLACE") 

Эти cammands не (добавить \ п)

my_string="esrhjg erguhg rziughrtPARTITIONED BY hz\nueirghf zreeuifh iuehg reuhg riutghSTORED ASiugh oer hfz" 
p="(?<=PARTITIONED BY).*(?=STORED AS)" 
str_replace(my_string,p,"TO REPLACE") 

Как сделать str_replace работу, если «между» строка содержит перевод строки \ п?

ответ

1

В ароматизаторе регулярного выражения ICU, используемый во всех stringr функциях, точка соответствует любому символу , но новая строка.

Вы можете использовать встроенный (?s) модификатор - "(?s)(?<=PARTITIONED BY).*(?=STORED AS)":

my_string="esrhjg erguhg rziughrtPARTITIONED BY hz\nueirghf zreeuifh iuehg reuhg riutghSTORED ASiugh oer hfz" 
p="(?s)(?<=PARTITIONED BY).*(?=STORED AS)" 
str_replace(my_string,p,"TO REPLACE") 

Обратите внимание, что вам не нужно этого сложного регулярное выражение, на самом деле, вы можете просто использовать регулярные выражения TRE с sub где . соответствует символ новой строки, тоже:

my_string = "esrhjg erguhg rziughrtPARTITIONED BY hzueirghf zreeuifh iuehg reuhg riutghSTORED ASiugh oer hfz" 
sub("PARTITIONED BY.*STORED AS", "PARTITIONED BY -TO_REPLACE- STORED AS", my_string) 
## or with backreferences: 
sub("(PARTITIONED BY).*(STORED AS)", "\\1 -TO_REPLACE- \\2", my_string) 

См. this IDEONE demo.

Если у вас есть несколько подстрок, чтобы заменить в строке, то вам нужно либо str_replace_all или gsub с рисунком, где .* заменяется .*?.

+1

удивительный, большое спасибо! –