stringr中的条件正则表达式

时间:2018-03-27 22:04:04

标签: r regex 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"

逻辑是"匹配b,如果后跟d匹配d,否则匹配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对解决方案开放。

1 个答案:

答案 0 :(得分:1)

你差不多了但是你应该在每一步中都有条件模式的真正断言:

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

Live demo

你甚至不需要有条件的正则表达式:

^(.*)bd|bc

R代码:

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