V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
flowfire
V2EX  ›  正则表达式

话说被替换的文本怎么获取正则里的重复次数?

  •  
  •   flowfire · 2018-05-01 15:39:33 +08:00 · 2128 次点击
    这是一个创建于 2408 天前的主题,其中的信息可能已经有所发展或是发生改变。

    其实我想要的是这么一个效果
    如果 文本中含有 3 个以下的数字 6,则不对其进行更改,如果有超过 3 个的,则替换为文字 六
    例如: 替换前的文本为

    测试 6 测试 66 测试 666 测试 6666 测试 66666
    

    替换后应该为

    测试 6 测试 66 测试 六六六 测试 六六六六 测试 六六六六六
    
    5 条回复    2018-05-01 17:01:04 +08:00
    imn1
        1
    imn1  
       2018-05-01 15:57:29 +08:00
    6{3,}
    geelaw
        2
    geelaw  
       2018-05-01 15:57:35 +08:00   ❤️ 1
    感谢你没有问 XY 问题。换一种思路,只匹配连续多个 6 里面的 6,替换为 六 即可。以 PowerShell (.NET) 为例

    ```PowerShell
    PS C:\> $r = '6(?=66)|(?<=6)6(?=6)|(?<=66)6'
    PS C:\> $r = [regex]::new($r)
    PS C:\> $text = '测试 6 测试 66 测试 666 测试 6666 测试 66666'
    PS C:\> $replacement = '六'
    PS C:\> $r.Replace($text, $replacement)
    测试 6 测试 66 测试 六六六 测试 六六六六 测试 六六六六六
    ```
    songz
        3
    songz  
       2018-05-01 16:48:46 +08:00
    感觉不能一步到位,只能先转到『六』,再挑出『六』和『六六』换回「 6 」
    momocraft
        4
    momocraft  
       2018-05-01 16:54:08 +08:00
    看 /6{3,}/ 这部分匹配的长度可以吗?

    '测试 6 测试 66 测试 666 测试 6666 测试 66666'.replace(/6{3,}/g, f => new Array(f.length+1).join('六'))
    imn1
        5
    imn1  
       2018-05-01 17:01:04 +08:00
    看错,原来每个 6 都要替换,#1 pass
    正则递归吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1206 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 18:28 · PVG 02:28 · LAX 10:28 · JFK 13:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.