我正在寻找一个正则表达式来捕获字符串中前7个字符的所有数字.
这个字符串有12个字符:
A12B345CD678
Run Code Online (Sandbox Code Playgroud)
我想删除A,B因为他们在前7个字符(A12B345)内得到
12345CD678
Run Code Online (Sandbox Code Playgroud)
所以,CD678不应该触及.我目前在R的解决方案:
paste(paste(str_extract_all(substr("A12B345CD678",1,7), "[0-9]+")[[1]],collapse=""),substr("A12B345CD678",8,nchar("A12B345CD678")),sep="??")
Run Code Online (Sandbox Code Playgroud)
这似乎太复杂了.我按照描述将字符串拆分为7,匹配前7个字符中的任何数字,并将其与字符串的其余部分绑定.
寻找一般答案,我目前的解决方案是拆分前7个字符,并匹配此子字符串中的所有数字.
任何帮助赞赏.
Wik*_*żew 14
您可以使用已知的SKIP-FAIL正则表达式技巧来匹配从第8个字符开始的所有其余字符串,并且只匹配前7个中的非数字字符和lookbehind:
s <- "A12B345CD678"
gsub("(?<=.{7}).*$(*SKIP)(*F)|\\D", "", s, perl=T)
## => [1] "12345CD678"
Run Code Online (Sandbox Code Playgroud)
请参阅IDEONE演示
将perl=T需要此正则表达式的工作.正则表达式细分:
(?<=.{7}).*$(*SKIP)(*F)- 匹配除换行符之外的任何字符((?s)如果输入中有换行符号,则在开头添加),尽可能多(.*),直到最后($也\\z可能需要删除最终换行符),但前提是7字符(由lookbehind设置(?<=.{7})).该(*SKIP)(*F)动词使发动机省略了整个匹配的文本,并在该文本的末尾推进正则表达式索引的位置.| - 要么...\\D - 非数字字符.请参阅正则表达式演示.
正则表达式解决方案很酷,但我会使用更容易阅读的东西来保持可维护性.例如
library(stringr)
str_sub(s, 1, 7) = gsub('[A-Z]', '', str_sub(s, 1, 7))
Run Code Online (Sandbox Code Playgroud)