我正在尝试检测字符串中的一些点 (.),并将它们替换为单词旁边的相同点,例如“.”变为“.AAA”。但有一些条件我想避免替换:
- 如果点之前有一个空格和一个字符
- 如果点位于两个连字符 (-) 之间
例如,如果输入是:
string <- "first. - second. - third. 4."
我想要的输出是:
"first.AAA - second. - third.AAA 4."
对于第一个条件,我可以弄清楚:
str_replace_all("[^ [A-Z19a-z]\\.]([\\.])","\\1AAA")
但是在阅读有关前瞻和后瞻以解决第二个条件并将两者混合在一起时感到困惑。
最佳答案
如果使用单个字符表示任何字符(包括换行符),则可以使用
gsub("(?s)(?:\\s.\\.|-[^-]*-)(*SKIP)(?!)|(\\.)", "\\1AAA", x, perl=TRUE)
请参阅regex demo 。如果您需要精确地确定“任何字符”条件,请将 \\s.\\.
中的未转义点替换为适当的结构。
详细信息:
(?s)
- 一个 dotalls
标志,使点匹配任何字符,包括换行符(?:\s.\.|-[^-]*-)
- 匹配任一的非捕获组\s.\.
- 一个空格、任意一个字符、一个点|
- 或-[^-]*-
- 连字符、除连字符之外的零个或多个字符,然后是连字符
(*SKIP)(?!)
- 跳过在当前位置失败的匹配,并触发从失败位置搜索下一个匹配|
- 或(\.)
- 第 1 组:一个点。
关于r - 在 r 和正则表达式中,如何检测排除某些混合条件的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68612942/