在正则表达式中重复子模式

时间:2017-09-06 22:06:05

标签: r

我有几个字符串

c("Sioux City, IA-NE-SD",
"Fort Smith, AR-OK")

我想从中提取州名。如您所见,有时有两种状态,有时是三种状态。我想重复第一个子模式以获得多个状态:

pat <- ".*(([A-Z]{2}-)+)([A-Z]{2})"
sub(pat, "\\2\\3", vec)

但在我的第一种情况下,这仅产生后两种状态:

"NE-SD"

我错过了什么?

1 个答案:

答案 0 :(得分:4)

.*贪婪,会吃尽可能多的东西,包括第一个州,如果有三个。请改为.*?

此外,您的替换为\\2\\3。第二组位于+之前的内部,因此它只匹配一个州和-。您需要替换为\\1\\3

所以总的来说:

pat <- ".*?(([A-Z]{2}-)+)([A-Z]{2})"
sub(pat, "\\1\\3", vec)