stringr 中的条件正则表达式

Conditional regular expressions in stringr

我想知道如何在 R 中实现条件正则表达式。看来这可以在 PERL 中实现:

?(if)then|else

但是,我无法弄清楚如何在 R 中实现它。举个简单的例子,假设我有以下字符串:

c('abcabd', 'abcabe')

我希望正则表达式匹配 "bd",否则匹配 "bc",然后将其替换为 "zz"。因此,我希望上面的字符串是:

c('abcazz', 'azzabe')

我已经尝试过使用 substr_replace 两者似乎都不起作用。看来我的语法在 sub:

中可能是错误的
sub('b(?(?=d)d|c)', 'zz', c('abcabe','abcabd'), perl=TRUE)
[1] "azzabe" "azzabd"

逻辑是"match b, if followed by d match d, otherwise match c"。使用 str_replace,我得到错误:

str_replace(c('abcabe','abcabd'), regex('b(?(?=d)d|c)'), 'zz')
Error in stri_replace_first_regex(string, pattern, fix_replacement(replacement),  : 
Use of regexp feature that is not yet implemented. (U_REGEX_UNIMPLEMENTED)

我主要使用 stringr,所以更喜欢使用 str_replace 的解决方案,但对使用 sub.

的解决方案持开放态度

你快接近了,但你应该在每一步中都有条件模式真断言:

(?(?=.*bd)bd|bc)

Live demo

您甚至不需要条件正则表达式:

^(.*)bd|bc

R代码:

sub('^(.*)bd|bc', '\1zz', c('abcabe','abcabd'))