Regex 正则表达式-通过gsub中的正则表达式匹配排除URL的特定部分

Regex 正则表达式-通过gsub中的正则表达式匹配排除URL的特定部分,regex,r,string,regex-negation,gsub,Regex,R,String,Regex Negation,Gsub,我正在使用下面的向量: vec <- c("http://statistics.gov.scot/id/statistical-geography/S02000002", "http://statistics.gov.scot/id/statistical-geography/S02000003") 但这只剩下vectorvec中的最后一个数字。我猜问题在于\\d{8},但是,我不清楚如何解决这个问题。我试过各种各样的解决办法,但都没有用。一些例子: (?-留下第二个

我正在使用下面的向量:

vec <- c("http://statistics.gov.scot/id/statistical-geography/S02000002",
         "http://statistics.gov.scot/id/statistical-geography/S02000003")
但这只剩下vector
vec
中的最后一个数字。我猜问题在于
\\d{8}
,但是,我不清楚如何解决这个问题。我试过各种各样的解决办法,但都没有用。一些例子:

  • (?-留下第二个数字
  • (?-相同)
我试图实现的目标可以简单概括为:*匹配所有内容,直到找到大写字母S和后面的8位数

笔记 我想通过
gsub
regex
找到解决方案,我不想使用:

  • 和原型物体
  • 我对使用
    substr
    不感兴趣,因为我可能需要处理长度可变的字符串

您可以使用

sub(".*(S\\d{8})", "\\1", vec)

使用
*
,我们可以匹配任意数量的(
*
-0或更多)字符,但要在
S
后面加上8位(
S\\d{8}
)。因为
(S\\d{8})
位于未替换的括号内,与此子模式匹配的子字符串被放入捕获组#1中。通过
\\1
反向引用,我们恢复结果中捕获的文本

有关和的更多信息,请访问regular-expressions.info

注意:如果在
S
+
8位之后有更多文本,可以使用

sub("^.*(S\\d{8}).*$", "\\1", vec)

您可以使用

sub(".*(S\\d{8})", "\\1", vec)

使用
*
,我们可以匹配任意数量的(
*
-0或更多)字符,但要在
S
后面加上8位(
S\\d{8}
)。因为
(S\\d{8})
位于未替换的括号内,与此子模式匹配的子字符串被放入捕获组#1中。通过
\\1
反向引用,我们恢复结果中捕获的文本

有关和的更多信息,请访问regular-expressions.info

注意:如果在
S
+
8位之后有更多文本,可以使用

sub("^.*(S\\d{8}).*$", "\\1", vec)

在这里,它的语法稍微漂亮一些:

library(rex)
library(stringi)
library(magrittr)

regex_1 = rex("S", digits)

vec <- c("http://statistics.gov.scot/id/statistical-geography/S02000002",
         "http://statistics.gov.scot/id/statistical-geography/S02000003")

vec %>% stri_extract_last_regex(regex_1)
库(rex)
图书馆(stringi)
图书馆(magrittr)
regex_1=rex(“S”,数字)
向量%stri\u extract\u last\u正则表达式(正则表达式1)

这里的语法稍微漂亮一些:

library(rex)
library(stringi)
library(magrittr)

regex_1 = rex("S", digits)

vec <- c("http://statistics.gov.scot/id/statistical-geography/S02000002",
         "http://statistics.gov.scot/id/statistical-geography/S02000003")

vec %>% stri_extract_last_regex(regex_1)
库(rex)
图书馆(stringi)
图书馆(magrittr)
regex_1=rex(“S”,数字)
向量%stri\u extract\u last\u正则表达式(正则表达式1)

仅供参考。
([:alnum:].[:punct:].])
也不会匹配任何东西。
*(?=S\\d{8})
这个正则表达式会匹配,并确保它后面跟着S,后面跟着8位数字(通过正向前瞻),这就是您要查找的内容?或者说,所有内容都是第一个S+8位数字:?(更新)FWIW您使用了一个负面的lookback,即:这之后是什么(?如果可能有多个Sxxx,您可以使用非贪婪版本。如果您想摆脱Sxxx部分,请使用
(*?)(=S\d{8})。*
并替换为
$1
,仅供参考。
([:alnum:].[:punch:]]
也将不匹配任何内容。
*(?=S\\d{8})
此正则表达式将执行、匹配并确保它后面跟着S,后面跟着8位数字(通过正向前瞻)是您要查找的内容?或者,实际上,所有内容直到前S+8位:?(更新)FWIW您使用的是负前瞻,即:这之后是什么(?如果可以使用多个Sxxx,您可以使用非贪婪版本。如果您想摆脱Sxxx部分,请使用
(.*)(=S\d{8})。*
并替换为
$1
,它肯定非常可读,但需要很多库。它肯定非常可读,但需要很多库。为什么使用
[\s\s]
而不仅仅是
?由于两者是互补的,这似乎过于复杂了regex@Tensibai:这是真的。我只是更习惯于基于PCRE的正则表达式,
在不设置单行模式的情况下不匹配换行符。事实上,它需要在正则表达式的开头使用多行修饰符。但我认为它可以做到这一点更具可读性。@Tensibai:谢谢您的评论,我删除了不必要的替代解决方案以避免任何混淆。为什么要使用
[\s\s]
而不仅仅是
?由于两者是互补的,这似乎过于复杂了regex@Tensibai:这是真的。我只是更习惯于基于PCRE的正则表达式,
在不设置单行模式的情况下不匹配换行符。事实上,它需要在正则表达式的开头使用多行修饰符。但我认为它可以做到这一点更具可读性。@Tensibai:谢谢你的评论,我删除了不必要的替代解决方案以避免任何混淆。