我有几个字符串
c("Sioux City, IA-NE-SD",
"Fort Smith, AR-OK")
我想从中提取州名。如您所见,有时有两种状态,有时是三种状态。我想重复第一个子模式以获得多个状态:
pat <- ".*(([A-Z]{2}-)+)([A-Z]{2})"
sub(pat, "\\2\\3", vec)
但在我的第一种情况下,这仅产生后两种状态:
"NE-SD"
我错过了什么?
答案 0 :(得分:4)
.*
贪婪,会吃尽可能多的东西,包括第一个州,如果有三个。请改为.*?
。
此外,您的替换为\\2\\3
。第二组位于+
之前的内部,因此它只匹配一个州和-
。您需要替换为\\1\\3
所以总的来说:
pat <- ".*?(([A-Z]{2}-)+)([A-Z]{2})"
sub(pat, "\\1\\3", vec)