r - 在 r 和正则表达式中,如何检测排除某些混合条件的字符
问题描述
我正在尝试检测字符串中的一些点 (.),并将它们替换为单词旁边的相同点,例如“。” 变成 ".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)
请参阅正则表达式演示。如果您需要明确“任何字符”条件,请将未转义的点替换\\s.\\.
为适当的构造。
详情:
(?s)
- 一个 dotalls
标志,使点匹配任何字符,包括换行符(?:\s.\.|-[^-]*-)
- 一个匹配的非捕获组\s.\.
- 一个空格,任何一个 char,一个点|
- 或者-[^-]*-
- 一个连字符,零个或多个字符,而不是一个连字符,然后是一个连字符
(*SKIP)(?!)
- 跳过在当前位置失败的匹配并触发从失败位置搜索下一个匹配|
- 或者(\.)
- 第 1 组:一个点。
推荐阅读
- c - 如何更改字符数组中的特定字符串?
- java - 在android的SearchView项目中更改搜索图标和文本的颜色
- python - 如何在 Python 中使用 pyfiglet 使打印文本居中
- python - 无法使用适用于 AWS Lambda 的无服务器框架加载 Python 依赖项:错误:STDOUT
- applescript - Applescript 使下一个选项卡成为 Photoshop 中的当前文档
- javascript - 从 HTML 页面获取动态内容 Python
- javascript - Firebase“添加”数据到现有文档不起作用
- swiftui - UIViewControllerRepresentable 奇怪的释放
- windows - 重命名文件夹后如何使用 Perforce P4V 客户端完全删除文件夹?
- ios - 如何为 iOS 14 设置 SwiftUI 应用程序,但如果 iOS 13 仍默认为 AppDelegate?