1

我在 R 的 stringr 包中使用 str_replace 函数。我想替换 PARTITIONED BY 和 STORED AS 之间的子字符串

这些命令有效

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 没有(我添加了一个 \n)

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")

如果“between”字符串包含换行符 \n,如何使 str_replace 工作?

4

1 回答 1

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 正则表达式与subwhere.匹配换行符一起使用:

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)

请参阅此 IDEONE 演示

如果您在一个字符串中有多个要替换的子字符串,您将需要str_replace_all或使用替换为gsub的模式。.*.*?

于 2016-08-09T13:05:33.463 回答