正则表达式保持匹配的部分

时间:2018-01-28 09:57:47

标签: r regex gsub

我想实现这个结果:"raster(B04) + raster(B02) - raster(A10mB03)" 因此,我创建了这个正则表达式:B[0-1][0-9]|A[1,2,6]0m/B[0-1][0-9]"

我现在正尝试用"B04 + B02 - A10mB03"

替换字符串gsub("B[0-1][0-9]]|[A[1,2,6]0mB[0-1][0-9]", "raster()", string)的所有匹配项

我如何包含原始值B01, B02, A10mB03

PS:我也试过gsub("B[0-1][0-9]]|[A[1,2,6]0mB[0-1][0-9]", "raster(\\1)", string),但它没有用。

1 个答案:

答案 0 :(得分:1)

基本上,您需要匹配一些文本并在替换模式中重复使用它。在基本R正则表达式方法中,如果没有capturing group,即一对非转义括号,在这种情况下包围整个正则表达式模式,并且使用\\1 replacement backreference,则无法做到这一点在替换模式中。

但是,您的正则表达式包含一些问题:[A[1,2,6]被解析为匹配A[1,,{的单个字符类{1}}或2,因为您在6之前放置了[。另请注意,字符类中的A与文字逗号匹配,并且它不是您所期望的。另一个类似的问题是使用, - 它将任何ASCII数字与[0-9]]匹配,然后匹配[0-9]]字符不必以正则表达式模式进行转义)。

因此,表达式的潜在修复可能看起来像

]

甚至只是匹配一个或多个字符(考虑到你提供的样本字符串)

gsub("(B[0-1][0-9]|A[126]0mB[0-1][0-9])", "raster(\\1)", string)

可能会这样做。

请参阅R demo online