将一行开头的N个空格替换为N个字符



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

list:
- first

应该变成:

list:
  - first

我试过:

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

返回:

list:
&nbsp;- first

其缺少一个CCD_ 2。如何改进替换以获得所需的输出?

您可以使用G锚点和K来重置报告匹配的起点。

匹配所有领先的单个空格:

(?:RK|G) 
  • (?:非捕获组
    • RK匹配新行并清除匹配缓冲区
    • |
    • G断言上一场比赛结束时的位置
  • )关闭非捕获组并匹配空间

查看regex演示和Ruby演示。


只匹配示例字符串中的单个前导空格:

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

在某些部分,模式匹配:

  • (?:非捕获组
    • ^.*:R匹配以:结尾的行并匹配新行
    • |
    • G断言上一个匹配的末尾或字符串开头的位置
  • )关闭非捕获组
  • K忘记目前匹配的内容,匹配一个空格

查看regex演示和Ruby演示。

示例

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"

参见字符串#*

使用带有回调函数的gsub

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

此打印:

list:
&nbsp;&nbsp;- first

图案CCD_ 18捕获在一条线的开始处的一个或多个空间。然后,这个匹配被传递给回调,回调用&nbsp;一次一个地替换每个空间。

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

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

请参阅regex演示详细信息

  • (?:G|^)-行或字符串的开头或上一个匹配的结尾
  • -一个空间

查看Ruby演示:

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

如果需要匹配任何空白,请将替换为s模式。如果只需要匹配水平空白,也可以使用h

相关内容

  • 没有找到相关文章

最新更新