【问题标题】:Replace all characters before @替换@之前的所有字符
【发布时间】:2021-08-26 09:37:06
【问题描述】:

我有一个字符串'test@gmail.com'

我想使用正则表达式将@之前的所有字符替换为星号(*)

所以预期的结果: '****@gmail.com'

我尝试使用这样的正则表达式: 'test@gmail.com'.gsub(/^.*?(?=@)/, '*') 但结果是*@gmail.com

或像这样的正则表达式: 'test@gmail.com'.gsub(/^[^@]*/, '*') 但结果相同 *@gmail.com

我不想使用.split 方法

请给点建议好吗?

【问题讨论】:

  • 您可以计算匹配的字符数量,并在替换中使用* 的数量。

标签: regex ruby


【解决方案1】:

你可以使用

'test@gmail.com'.gsub(/.(?=.*@)/, '*')

请参阅 regex demoRuby demo

.(?=.*@) 正则表达式匹配除换行符之外的任何一个字符,该字符前面紧跟除换行符之外的任何零个或多个字符,然后是 @ 字符。

电子邮件地址中不太可能有换行符,但如果您需要支持换行符,请不要忘记添加 m 标志:

/.(?=.*@)/m

【讨论】:

    【解决方案2】:

    对于该模式,您可以将第二种方法与否定字符类一起使用

    ^[^\s@]+(?=@)
    

    模式匹配:

    • ^ 字符串开始
    • [^\s@]+ 匹配除 @ 或空白字符以外的任何字符 1 次以上
    • (?=@) 将 @ 断言到右侧

    Regex demo | Ruby demo

    然后您可以替换为匹配的字符数。

    'test@gmail.com'.gsub(/^[^\s@]+(?=@)/){|m| '*' * m.length }
    

    输出

    ****@gmail.com
    

    另一个使用\G锚点的选项:

    \G[^@](?=[^@]*@)
    

    Regex demo | Ruby demo

    模式匹配:

    • \G 在上一场比赛结束时或开始时(在这种情况下)断言位置
    • [^@] 匹配除@ 之外的任何字符(添加\s 以不匹配空格或换行符)
    • (?=[^@]*@) 在右侧声明 @

    Ruby 示例

    'test@gmail.com'.gsub(/\G[^@](?=[^@]*@)/, '*')
    

    输出

    ****@gmail.com
    

    【讨论】:

      【解决方案3】:

      试试这个 email.replaceAll("(^[^@]{0}|(?!^)\G)[^@]", "$1*")

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 2017-06-04
        • 1970-01-01
        • 2012-08-29
        • 1970-01-01
        相关资源
        最近更新 更多