首页 > 解决方案 > 在 r 和正则表达式中,如何检测排除某些混合条件的字符

问题描述

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

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

例如,如果输入是:

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

我想要的输出是:

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

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

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

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

标签: rregex

解决方案


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

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

请参阅正则表达式演示。如果您需要明确“任何字符”条件,请将未转义的点替换\\s.\\.为适当的构造。

详情

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

推荐阅读