我承认这些正则表达式问题之前已经被问过,但我仍然在努力寻找可行的解决方案(即使在咨询了 ChatGPT 之后)。
举以下例子:text <- c("test1", "test2 | ", "test3 | test3 | test 3", "test4 | test4 | test 4 | test4")
我想删除从第 n 次(在我的情况下是第二次)出现“ | ”开始的所有文本。
因此输出应该是:output <- c("test1", "test2 | ", "test3 | test3", "test4 | test4")
当带有最多两个“|”文本时,我可以让它工作str_remove(text, "( \\| [^\\|]+$)")
,但是这不适用于该匹配模式出现两次以上的情况。
一种解决方案可能是提取感兴趣的字符串,而不是删除不需要的部分。为此,您可以使用正则表达式匹配感兴趣的三种情况,按长度降序排列:
[:graph:]+ \\| [:graph:]+
、[:graph:]+ \\|
或[:graph:]+
。您可以使用
在哪里
\|
是你的分隔符.*?
匹配任何文本(除换行符外,(?s)
在模式开头添加以使其跨行匹配)str_replace
要求在删除匹配值后保留第一个组值。在线查看R 演示(这里是最终的正则表达式演示)。
另一个想法是使用
sub
具有这种模式的基本 R 函数。请参阅 regex101 上的此演示或tio.run 上的 R 演示
所需部分由第一组捕获,该组也用作替换。消耗字符串的其余部分(将被删除)。 管道符号之间是除 之外的否定字符类字符。之前的惰性字符用于防止以空格结尾。
.*
|
[^|]*?
\s*|
要将其调整为第 n 次出现,请将其替换
[^|]*\\|
为(?:[^|]*\\|){n}
(regex101 demo with n=2)。如果由于缺乏对惰性量词的支持而无法正常工作(演示有效),请附上,perl=T
。