我有一个字符串向量,如下所示:
a - bc/def_g - A/mn/us/ww
opq - rs/ts_uf - BC/wx/yza
Abc - so/dhie7u - XYZ/En/xy/jkq - QWNE
我希望在第二个短划线( - )之后但在第一个闪光(/)之前得到文本,即结果看起来像
A
BC
XYZ
最好的方法是什么(矢量的行数超过500K。)
谢谢
答案 0 :(得分:1)
假设您的字符串定义如下:
string <- c("a - bc/def_g - A/mn/us/ww",
"opq - rs/ts_uf - BC/wx/yza",
"Abc - so/dhie7u - XYZ/En/xy/jkq - QWNE")
然后您可以使用sub
> sub(".*\\-\\s+([A-Z]+)/.*", "\\1", string)
[1] "A" "BC" "XYZ"
答案 1 :(得分:1)
^[^-]*-[^-]*-\s*\K[^/]+
^
在行首处断言位置[^-]*
匹配除-
以外的任何字符-
按字面意思匹配[^-]*
匹配除-
以外的任何字符-
按字面意思匹配\s*
匹配任意数量的空白字符\K
重置模式的起点。最终匹配中不再包含任何以前消费的字符[^/]+
匹配/
除{/ 1}}之外的任何字符或者,正如Jan在下面的评论中所建议的(我相信它已被删除),^(?:\[^-\]*-){2}\s*\K\[^/\]+
可能会被使用。它更短,更容易扩展,但更多的步骤。
x <- c("a - bc/def_g - A/mn/us/ww", "opq - rs/ts_uf - BC/wx/yza", "Abc - so/dhie7u - XYZ/En/xy/jkq - QWNE")
m <- regexpr("^[^-]*-[^-]*-\\s*\\K[^/]+", x, perl=T)
regmatches(x, m)
结果:[1] "A" "BC" "XYZ"