连续替换所有正则表达式匹配,有条件地从起点

时间:2016-03-11 17:08:54

标签: regex

有点笨重的描述,但这是一个例子。我想转s

s="something in the beginning #and something here at the end"

进入t

t="something in the beginning #and_something_here_at_the_end"

也就是说,使用正则表达式将所有空格替换为_,但仅限于我在包含#字符的行中,并且仅在其后的句子中。< / p>

我的问题是我可以使用正则表达式来寻找 s/(.*)#(.*) (.*)/\1#\2_\3/,但是我无法在任意数量的空格中执行此操作...另一方面,我无法简单地使用s/ /_/g,因为它只是#。 ll会替换 gl_Position = projection*view * model * vec4(position, 1.0f); 符号前的所有空格,也会替换没有此符号的行(我希望保留原样)。

这是一个玩具示例,我想知道在一般情况下如何使用正则表达式执行此操作。

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用匹配在最后一个位置和\G位置的\K锚点来保存之前匹配的内容。这导致

(?:^[^\#]*#|(?!^)\G)[^\s]*\K(\s)

并将其替换为_

  • ^[^\#]*#以字符串开头的锚点开头,然后匹配任何非#和#
  • (?!^)\G匹配上一场比赛的排名。有一个先行,以确保我们不在字符串的开头(第一次运行\ G在开始时初始化)
    • [^\s]*\K匹配任何非空格,然后忘记匹配,直到此处
  • (\ s)匹配空白

演示:https://regex101.com/r/oU4hN4/1