我正在寻找一个正则表达式来捕获字符串中前7个字符的所有数字。
此字符串包含12个字符:
A12B345CD678
我想删除A
和B
,因为它们位于前7个字符(A12B345
)内并且
12345CD678
因此,不应触及CD678
。我目前在R的解决方案:
paste(paste(str_extract_all(substr("A12B345CD678",1,7), "[0-9]+")[[1]],collapse=""),substr("A12B345CD678",8,nchar("A12B345CD678")),sep="")
看起来太复杂了。我按照描述将字符串拆分为7,匹配前7个字符中的任何数字,并将其与字符串的其余部分绑定。
寻找一般答案,我目前的解决方案是拆分前7个字符,并匹配此子字符串中的所有数字。
任何帮助表示感谢。
答案 0 :(得分:14)
您可以使用已知的SKIP-FAIL regex trick来匹配从第8个字符开始的所有字符串的其余部分,并且只匹配前7个字符串中的非数字字符与lookbehind:
s <- "A12B345CD678"
gsub("(?<=.{7}).*$(*SKIP)(*F)|\\D", "", s, perl=T)
## => [1] "12345CD678"
请参阅IDEONE demo
此正则表达式需要perl=T
才能正常工作。正则表达式分解:
(?<=.{7}).*$(*SKIP)(*F)
- 匹配除换行符之外的任何字符(如果输入中有换行符号,则在开头添加(?s)
),尽可能多(.*
)直到最后($
,也可能需要\\z
删除最终换行符),但前提是前面有7个字符(由lookbehind (?<=.{7})
设置)。 (*SKIP)(*F)
动词使引擎省略整个匹配的文本,并将正则表达式索引推进到该文本末尾的位置。|
- 或...... \\D
- 一个非数字字符。请参阅regex demo。
答案 1 :(得分:5)
正则表达式解决方案很酷,但我会使用更易于阅读的内容来实现可维护性。 E.g。
library(stringr)
str_sub(s, 1, 7) = gsub('[A-Z]', '', str_sub(s, 1, 7))
答案 2 :(得分:2)
你也可以使用一个简单的负面观察:
s <- "A12B345CD678"
gsub("(?<!.{7})\\D", "", s, perl=T)