【问题标题】:Reset match token only works every two characters重置匹配令牌仅每两个字符有效
【发布时间】:2022-06-28 22:04:25
【问题描述】:

我想使用重置匹配标记 (\K) 在单词的每个字母之间添加一个句号。我不想使用积极的向后看。

gsub("\\pL\\K", ".", "adskhfks", perl = TRUE)

# [1] "a.ds.kh.fk.s"

由于某些原因,这仅适用于每两个字母(在 macOS 12.31 上使用 RStudio 4.2.0。)。它在regex101 上按预期工作。

这正常吗?有解决办法吗?

【问题讨论】:

  • 在这种情况下使用基于lookbehind的模式没有任何问题。 R 中的 PCRE 实现与 PHP 的 PCRE 实现(您在 regex101 测试的那个)有点不同。当然,您也可以捕获该字母,然后在替换模式中使用反向引用。
  • 我认为发生这种情况的原因就在这里stackoverflow.com/questions/41924971/…

标签: r regex


【解决方案1】:

这是一个错误,而不是使用 \K 运算符的消费模式,您将不得不使用基于后视的模式:

gsub("(?<=\\p{L})", ".", "adskhfks", perl = TRUE)

(?&lt;=\p{L}) 肯定后向匹配匹配紧接在任何 Unicode 字母前面的位置。

或者,带有反向引用的捕获组:

gsub("(\\p{L})", "\\1.", "adskhfks", perl = TRUE)

这里,(\p{L}) 将任何 Unicode 字母捕获到第 1 组,\1. 替换放回第 1 组的值并在其上附加一个点。

R demo

gsub("\\pL\\K", ".", "adskhfks", perl = TRUE)
# [1] "a.ds.kh.fk.s"
gsub("(?<=\\p{L})", ".", "adskhfks", perl = TRUE)
# [1] "a.d.s.k.h.f.k.s."
gsub("(\\pL)", "\\1.", "adskhfks", perl = TRUE)
# [1] "a.d.s.k.h.f.k.s."

【讨论】:

    猜你喜欢
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    相关资源
    最近更新 更多