使用sub/gsub交换字符串并移除括号的技术实现问题
问题解决
你的正则主要存在三个问题:
- 捕获组不匹配:仅定义了1个捕获组,却用
\2引用第二个分组,会导致报错 - 字符范围错误:
[A-z]会包含[、\等非字母符号,无法匹配带空格的地名 - 未覆盖逗号可选场景:需求提到逗号可能不存在,你的正则没处理这种情况
正确的R代码
针对固定格式的字符串,用以下正则可实现需求:
# 测试两种场景:带逗号/不带逗号 team_with_comma <- "Newcastle United, (Premier League)" team_without_comma <- "Arsenal (Premier League)" # 执行替换 gsub("^(.+?)(?:, )?\\((.+)\\)$", "\\2, \\1", team_with_comma) # 输出:"Premier League, Newcastle United" gsub("^(.+?)(?:, )?\\((.+)\\)$", "\\2, \\1", team_without_comma) # 输出:"Premier League, Arsenal"
正则说明
^(.+?):非贪婪匹配开头的第一个地名(^确保从字符串起始位置匹配,+?避免过度匹配到括号区域)(?:, )?:非捕获组,匹配可选的逗号加空格(?:表示该组不被捕获,?标记为可选)\\((.+)\\):捕获括号内的第二个地名,\\(和\\)转义匹配实际括号,(.+)匹配括号内所有内容(含空格)\\2, \\1:交换两个捕获组的内容,并用逗号分隔
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

