tidyr::separate_wider_regex是否支持多行正则标志(?m)或regex(..., multiline=TRUE)?
解决tidyr::separate_wider_regex处理多行文本的问题
正确实现代码
library(tibble) library(tidyr) tibble(x = 'a\nmultiline\ntext') %>% separate_wider_regex( x, c( _ = '.*?', # 下划线表示丢弃该匹配部分 m = 'multiline', _ = '.*' ), regex_spec = regex(flags = 's') # 开启DOTALL模式,让`.`匹配换行符 )
运行后得到预期结果:
# A tibble: 1 × 1 m <chr> 1 multiline
问题原因分析
- 正则标志设置错误:
separate_wider_regex不支持在单个正则片段中嵌入(?m)这类模式标志,需通过regex_spec参数统一配置全局正则选项。 - 缺少DOTALL模式:默认正则中
.不匹配换行符\n,原代码里的.*?只能匹配第一行的a,无法覆盖a\n部分,导致整个模式无法匹配完整字符串,触发报错。开启flags = 's'(DOTALL模式)后,.会匹配包括换行在内的所有字符,确保整个字符串被完整匹配。 - 多行模式(?m)并非必需:你的需求是捕获跨多行文本中的特定片段,多行模式仅作用于
^和$(匹配每行首尾),此处不需要,真正需要的是让.匹配换行的DOTALL模式。
补充:若需同时使用多行模式
如果场景需要让^/$匹配每行首尾,可同时开启DOTALL和多行模式:
regex_spec = regex(flags = 'sm')
内容的提问来源于stack exchange,提问作者Dan Wilt
相关产品推荐
相关产品推荐

