用 N 个字符替换行首的 N 个空格

Replace N spaces at the beginning of a line with N characters

我正在寻找一个正则表达式替换来将一行开头的 N 个空格转换为 N  。所以这段文字:

list:
  - first

应该变成:

list:
  - first

我试过:

str = "list:\n  - first"
str.gsub(/(?<=^) */, "&nbsp;")

哪个returns:

list:
&nbsp;- first

少了一个 &nbsp;。如何改进替换以获得所需的输出?

gsub与回调函数一起使用:

str = "list:\n  - first"
output = str.gsub(/(?<=^|\n)[ ]+/) {|m| m.gsub(" ", "&nbsp;") }

这会打印:

list:
&nbsp;&nbsp;- first

模式 (?<=^|\n)[ ]+ 在一行的开头捕获一个或多个 space。然后将此匹配传递给回调,回调将每个 space 一次替换为 &nbsp;.

您可以使用 \G anchor\K 来重置报告比赛的起点。

匹配所有前导单spaces:

(?:\R\K|\G) 
  • (?:非捕获组
    • \R\K 匹配一个换行符并清除匹配缓冲区
    • |
    • \G 断言上一场比赛结束时的位置
  • ) 关闭非捕获组并匹配一个space

看到一个regex demo and a Ruby demo


仅匹配示例字符串中的单个前导 space:

(?:^.*:\R|\G)\K 

在部分中,模式匹配:

  • (?:非捕获组
    • ^.*:\R匹配以:结尾的行和匹配一个换行符
    • |
    • \G 断言位置在上一个匹配的末尾,或者在字符串的开头
  • )关闭非捕获组
  • \K 忘记目前匹配的是什么,匹配一个space

看到一个regex demo and a Ruby demo

例子

re = /(?:^.*:\R|\G)\K /
str = 'list:
  - first'
result = str.gsub(re, '&nbsp;')

puts result

输出

list:
&nbsp;&nbsp;- first

我会写

"list:\n  - first".gsub(/^ +/) { |s| '&nbsp;' * s.size }
  #=> "list:\n&nbsp;&nbsp;- first"

String#*

您可以使用带有纯文本 &nbsp; 替换模式的短 /(?:\G|^) / 正则表达式:

result = text.gsub(/(?:\G|^) /, '&nbsp;')

参见regex demo详情:

  • (?:\G|^) - 一行或字符串的开头或上一场比赛的结尾
  • - 一个 space.

看到一个Ruby demo:

str = "list:\n  - first"
result = str.gsub(/(?:\G|^) /, '&nbsp;')
puts result
# => 
#  list:
#  &nbsp;&nbsp;- first

如果您需要匹配任何白色space,请将 替换为 \s 模式。或者如果只需要匹配水平白色space.

,则使用\h