Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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
R 替换字符串中标点符号的第二个实例?_R_Regex - Fatal编程技术网

R 替换字符串中标点符号的第二个实例?

R 替换字符串中标点符号的第二个实例?,r,regex,R,Regex,具有多个具有该模式的字符串: A/B/C/D 我只需要将第二个“/”改为其他内容(比如,*) 所以A/B/C/D-->A/B*C/D gsub('(^[[:punct:]])([[:punct:]])', "*", string) #Didn't Work gsub('[[:punct:]]{2}', "*", string) #Didn't work 你可以用 sub("([^[:punct:]]*[[:punct:]][^[:punct:]]*)[[:punct:]]", "\\1*",

具有多个具有该模式的字符串:

A/B/C/D

我只需要将第二个“/”改为其他内容(比如,*)

所以A/B/C/D-->A/B*C/D

gsub('(^[[:punct:]])([[:punct:]])', "*", string) #Didn't Work
gsub('[[:punct:]]{2}', "*", string) #Didn't work
你可以用

sub("([^[:punct:]]*[[:punct:]][^[:punct:]]*)[[:punct:]]", "\\1*", string)

sub
功能将查找单个(首次)出现的

  • ([^[:punct:][]*[^[:punct:][]*)
    -第1组(
    \1
    指替换模式中的此值):0个字符(标点符号除外),一个标点符号,然后再0个字符(标点符号除外)
  • [[:punct:]
    -标点符号
或者,您可以尝试类似的PCRE正则表达式,如

sub("\\P{P}*\\p{P}\\P{P}*\\K\\p{P}", "*", string, perl=TRUE)

但是,要小心。或者将所有
\p{p}
替换为
[\p{p}\p{S}]
,并将所有
\p{p}
替换为您可以使用的
[^\p{p}\p{S}]

sub("([^[:punct:]]*[[:punct:]][^[:punct:]]*)[[:punct:]]", "\\1*", string)

sub
功能将查找单个(首次)出现的

  • ([^[:punct:][]*[^[:punct:][]*)
    -第1组(
    \1
    指替换模式中的此值):0个字符(标点符号除外),一个标点符号,然后再0个字符(标点符号除外)
  • [[:punct:]
    -标点符号
或者,您可以尝试类似的PCRE正则表达式,如

sub("\\P{P}*\\p{P}\\P{P}*\\K\\p{P}", "*", string, perl=TRUE)


但是,要小心。或者将所有
\p{p}
替换为
[\p{p}\p{S}]
,将所有
\p{p}
替换为
[^\p{p}\p{S}]

我们可以尝试使用
sub
捕获一个或多个非
/
字符,后跟
/
字符和非
/
字符作为一个组,并在替换中使用捕获组的反向引用(
\\1
)和字符
*

sub("^([^/]+[/][^/]+)[/]", "\\1*", str1)
#[1] "A/B*C/D"

此外,如果字符串长度固定,每个字母后跟
/
,则可以使用
子字符串执行赋值

substring(str1, 4, 4) <- "*"

substring(str1,4,4)我们可以尝试使用
sub
来捕获一个或多个非
/
的字符,后跟
/
和非
/
的字符作为一个组,并在替换过程中使用带有
*
字符的捕获组的反向引用(
\\1

sub("^([^/]+[/][^/]+)[/]", "\\1*", str1)
#[1] "A/B*C/D"

此外,如果字符串长度固定,每个字母后跟
/
,则可以使用
子字符串执行赋值

substring(str1, 4, 4) <- "*"

子字符串(str1,4,4)我们可以使用一个lookback来匹配遵循“单词字符正斜杠单词字符”模式的
/

当然,在这种情况下,我们也可以使用
[^[:punct:]
[:punct:]]
的组合来实现相同的结果。请注意,以下模式更为普遍:

sub("(?<=^[^[:punct:]][[:punct:]][^[:punct:]])[[:punct:]]", "*", "A/B/C/D", perl = TRUE)
# [1] "A/B*C/D"

sub((?我们可以使用lookback来匹配遵循“单词字符正斜杠单词字符”模式的
/

当然,在这种情况下,我们也可以结合使用
[^[:punct:][]
[:punct:][]
来获得相同的结果。请注意,以下模式更通用:

sub("(?<=^[^[:punct:]][[:punct:]][^[:punct:]])[[:punct:]]", "*", "A/B/C/D", perl = TRUE)
# [1] "A/B*C/D"

sub(“(?将此添加为答案,因为它是“最干净的”,但Wiktor Stribizew的解决方案也起作用。将此添加为答案,因为它是“最干净的”,但Wiktor Stribizew的解决方案也起作用。“sub”解决方案确实起作用,PCRE解决方案在我的具体情况下不起作用,但我还是对该解决方案表示赞赏。谢谢!sub解决方案Indeed工作得很好,PCRE解决方案在我的情况下不起作用,但我还是对该解决方案表示赞赏。谢谢!