在 r 和正则表达式中,如何在排除某些混合条件的情况下检测字符

时间:2021-08-01 17:43:07

标签: r regex

我正在尝试检测字符串中的一些点 (.) 并将它们替换为单词旁边的相同点,例如“.”变成“.AAA”。但有一些条件我想避免替换:

  1. 如果有一个空格,然后在点之前有一个字符
  2. 如果点位于两个连字符 (-) 之间

例如,如果输入是:

string <- "first. - second. - third. 4."

我想要的输出是:

"first.AAA - second. - third.AAA 4."

对于第一个条件,我可以弄清楚:

str_replace_all("[^ [A-Z19a-z]\\.]([\\.])","\\1AAA")

但是在阅读有关解决第二个条件并将两者混合在一起的前视和后视时感到困惑。

1 个答案:

答案 0 :(得分:2)

如果用单个字符表示任何字符,包括换行符,则可以使用

gsub("(?s)(?:\\s.\\.|-[^-]*-)(*SKIP)(?!)|(\\.)", "\\1AAA", x, perl=TRUE)

参见regex demo。如果您需要确定“任何字符”条件,请将 \\s.\\. 中未转义的点替换为适当的结构。

详情

  • (?s) - dotall s 标志,使点匹配任何字符,包括换行符
  • (?:\s.\.|-[^-]*-) - 一个非捕获组匹配
    • \s.\. - 一个空格、任意一个字符、一个点
    • | - 或
    • -[^-]*- - 一个连字符,零个或多个字符,而不是一个连字符和一个连字符
  • (*SKIP)(?!) - 跳过当前位置失败的匹配并触发从失败位置开始搜索下一个匹配
  • | - 或
  • (\.) - 第 1 组:一个点。