Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 仅删除前N个字符中的任何数字_Regex_R - Fatal编程技术网

Regex 仅删除前N个字符中的任何数字

Regex 仅删除前N个字符中的任何数字,regex,r,Regex,R,我正在寻找一个正则表达式来捕获字符串前7个字符中的所有数字 此字符串有12个字符: A12B345CD678 我只想删除A和B,因为它们位于前7个字符(A12B345)内,并且 因此,不应触摸CD678。我目前在R中的解决方案: paste(paste(str_extract_all(substr("A12B345CD678",1,7), "[0-9]+")[[1]],collapse=""),substr("A12B345CD678",8,nchar("A12B345CD678")),sep

我正在寻找一个正则表达式来捕获字符串前7个字符中的所有数字

此字符串有12个字符:

A12B345CD678
我只想删除
A
B
,因为它们位于前7个字符(
A12B345
)内,并且

因此,不应触摸
CD678
。我目前在R中的解决方案:

paste(paste(str_extract_all(substr("A12B345CD678",1,7), "[0-9]+")[[1]],collapse=""),substr("A12B345CD678",8,nchar("A12B345CD678")),sep="‌​") 
这似乎太复杂了。如前所述,我将字符串拆分为7,匹配前7个字符中的任何数字,并将其与字符串的其余部分绑定

为了寻找一个通用的答案,我目前的解决方案是拆分前7个字符,然后只匹配子字符串中的所有数字

非常感谢您的帮助。

您可以使用“已知”匹配以第8个字符开头的字符串的所有其余部分,并且仅匹配前7个字符中具有查找功能的非数字字符:

s <- "A12B345CD678"
gsub("(?<=.{7}).*$(*SKIP)(*F)|\\D", "", s, perl=T)
## => [1] "12345CD678"
s <- "A12B345CD678"
gsub("(?<!.{7})\\D", "", s, perl=T)
s[1]“12345CD678”

这个正则表达式需要
perl=T
。正则表达式细分:


  • (?正则表达式解决方案很酷,但为了便于维护,我会使用一些更容易阅读的方法

    library(stringr)
    
    str_sub(s, 1, 7) = gsub('[A-Z]', '', str_sub(s, 1, 7))
    

    您还可以使用简单的反向查找:

    s <- "A12B345CD678"
    gsub("(?<=.{7}).*$(*SKIP)(*F)|\\D", "", s, perl=T)
    ## => [1] "12345CD678"
    
    s <- "A12B345CD678"
    gsub("(?<!.{7})\\D", "", s, perl=T)
    

    s您的问题对我来说没有任何意义。
    12345CD678
    超过7个字符,甚至超过7个数字-您所说的
    第一个E-F
    是什么意思?您的示例令人困惑。“第一个E-F 7个字符”是什么?为什么即使不是数字也要匹配CD?请发布您当前的解决方案。更清楚地说,A12B345CD678有12个字符。我想匹配前7个字符中的所有数字,这样CD678就不会被触碰。我当前的解决方案是:粘贴(粘贴(str_extract_all(substr)(“A12B345CD678”,1,7),“[0-9]+”[[1]],collapse=”“),substr(“A12B345CD678”,8,nchar(“A12B345CD678”)),sep=“”),这似乎太复杂了。我按照描述将字符串拆分为7,匹配前7个字符中的任何数字,并将其与字符串的其余部分绑定。似乎您需要可变长度的查找:
    (?开箱即用的好主意Stribiżew!非常好用,特别感谢您的解释。如果有新行,下面是正则表达式的样子:.[A-Z]应该是[A-Za-Z]?