在零长度断言后替换多次出现的字符

问题描述 投票:0回答:1

我想在文本编辑器中使用 PCRE2 正则表达式将以

_
开头的行中的每个
-
替换为
#| label: 

示例:

#| label: my_chunk_label
my_function_name <- function(x)

应该变成:

#| label: my-chunk-label
my_function_name <- function(x)

与 .NET 正则表达式相反,可以将

(?<=^#\| label: .+)_
替换为
-
(regex101 示例),PCRE2 不支持无限向后查找,因此正则表达式无效。到目前为止,我发现的唯一方法是用
^#[^_]+\K_
(regex101 示例)
重复替换 -,但我很好奇是否有单遍解决方案。

regex pcre
1个回答
0
投票

如果您使用 PCRE,则可以使用

\G
\K

然后在替换中使用

-

(?:^#|\h+label:\h+|\G(?!^))[^\r\n_]*\K_

模式匹配:

  • (?:
    替代方案的非捕获组
    • ^#|\h+label:\h+
      匹配应位于字符串开头的模式,其中
      \h
      匹配水平空白字符
    • |
      或者
    • \G(?!^)
      在上一场比赛结束时断言当前位置,而不是在开始时
  • )
    关闭非捕获组
  • [^\r\n_]*
    匹配除换行符或
    _
  • 之外的可选字符
  • \K
    忘记到目前为止匹配了什么
  • _
    匹配下划线

正则表达式演示

© www.soinside.com 2019 - 2024. All rights reserved.