正则表达式,匹配包含换行符的字符串,并在 R 中环顾 str_replace

regex, match string which contains linebreak with lookaroud str_replace in R

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

那些命令没有(我加了一个\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 工作?

在所有 stringr 函数中使用的 ICU 正则表达式风格中,点匹配任何字符 但换行符 .

您可以使用内联 (?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_allgsub 中的一个模式,其中 .* 替换为 .*?