代码之家  ›  专栏  ›  技术社区  ›  builder-7000

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

  •  1
  • builder-7000  · 技术社区  · 4 年前

    我正在寻找一个正则表达式替换,将一行开头的N个空格转换为N   .因此本文:

    list:
      - first
    

    应该成为:

    list:
      - first
    

    我试过:

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

    返回:

    list:
    &nbsp;- first
    

    少了哪一个 &nbsp; .如何改进替代以获得所需的产量?

    2 回复  |  直到 4 年前
        1
  •  2
  •   The fourth bird    4 年前

    你可以利用 \G anchor \K 重置报告的匹配的起点。

    要匹配所有前导的单个空格:

    (?:\R\K|\G) 
    
    • (?: 非捕获组
      • \R\K 匹配换行符并清除匹配缓冲区
      • |
      • \G 在上一个匹配结束时声明位置
    • ) 关闭非捕获组并匹配一个空间

    看到了吗 regex demo 还有 Ruby demo .


    要仅匹配示例字符串中的单个前导空格,请执行以下操作:

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

    在某些方面,模式匹配:

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

    看到了吗 regex demo 还有 Ruby demo .

    实例

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

    输出

    list:
    &nbsp;&nbsp;- first
    
        2
  •  1
  •   Tim Biegeleisen    4 年前

    使用 gsub 使用回调函数:

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

    这张照片是:

    list:
    &nbsp;&nbsp;- first
    

    模式 (?<=^|\n)[ ]+ 捕获一行开头的一个或多个空格。然后,这个匹配被传递给回调函数,回调函数用 &nbsp; .