匹配&用REGEX替换多个带引号的字符串

时间:2017-05-25 22:59:19

标签: r regex

我想用R中的下划线替换引号中的所有空格。当不止一个时,我不确定如何正确定义引用的字符串。我的开始努力失败了,我甚至没有接受单/双引号。

require(stringi)
s = "The 'quick brown' fox 'jumps over' the lazy dog"
stri_replace_all(s, regex="('.*) (.*')", '$1_$2')
#> [1] "The 'quick brown' fox 'jumps_over' the lazy dog"

感激帮助。

2 个答案:

答案 0 :(得分:4)

我们假设您需要匹配以'开头的所有非重叠子字符串,然后包含除'以外的1个或多个字符,然后以'结尾。模式为'[^']+'

然后,您可以使用以下基本R代码:

x = "The 'quick cunning brown' fox 'jumps up and over' the lazy dog"
gr <- gregexpr("'[^']+'", x)
mat <- regmatches(x, gr)
regmatches(x, gr) <- lapply(mat, gsub, pattern="\\s", replacement="_")
x
## => [1] "The 'quick_cunning_brown' fox 'jumps_up_and_over' the lazy dog"

this R demo。或者,使用gsubfn

> library(gsubfn)
> rx <- "'[^']+'"
> s = "The 'quick cunning brown' fox 'jumps up and over' the lazy dog"
> gsubfn(rx, ~ gsub("\\s", "_", x), s)
[1] "The 'quick_cunning_brown' fox 'jumps_up_and_over' the lazy dog"
> 

要支持转义序列,您可以使用更复杂的PCRE正则表达式:

(?<!\\)(?:\\{2})*\K'[^'\\]*(?:\\.[^'\\]*)*'

<强>详情:

  • (?<!\\) - 紧靠当前位置之前的\
  • (?:\\{2})* - 零个或多个2 \ s
  • 的序列
  • \K - 匹配重置运算符
  • ' - 单引号
  • [^'\\]* - 除'\以外的零个或多个字符
  • (?:\\.[^'\\]*)* - 零个或多个序列:
    • \\. - \后跟任何字符,但换行符
    • [^'\\]* - 除'\以外的零个或多个字符
  • ' - 单引号。

R demo看起来像

x = "The \\' \\\\\\' \\\\\\\\'quick \\'cunning\\' brown' fox 'jumps up \\'and\\' over' the lazy dog"
cat(x, sep="\n")
gr <- gregexpr("(?<!\\\\)(?:\\\\{2})*\\K'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'", x, perl=TRUE)
mat <- regmatches(x, gr)
regmatches(x, gr) <- lapply(mat, gsub, pattern="\\s", replacement="_")
cat(x, sep="\n")

输出:

The \' \\\' \\\\'quick \'cunning\' brown' fox 'jumps up \'and\' over' the lazy dog
The \' \\\' \\\\'quick_\'cunning\'_brown' fox 'jumps_up_\'and\'_over' the lazy dog

答案 1 :(得分:1)

试试这个:

require(stringi)
s = "The 'quick brown' fox 'jumps over' the lazy dog"
stri_replace_all(s, regex="('[a-z]+) ([a-z]+')", '$1_$2')