【问题标题】:Regex to Mask all but Last Two Digits of a Number of Specific Length正则表达式屏蔽除特定长度的最后两位之外的所有数字
【发布时间】:2019-10-21 12:03:34
【问题描述】:

我有一个字符串,我试图只屏蔽一个 10 位数字,除了最后两个数字。在 Java 中寻找它的正则表达式值。

出于所有意图和目的,字符串是“Godel1234567890Escher753951852456Bach7894561230”应该得到“GodelXXXXXXXX90Escher753951852456BachXXXXXXXX30”。

到目前为止,我的正则表达式值是str.replaceAll("(?<!\\d)\\d{10}(?!\\d)", XXXXXXXX) 这只能得到 10 位数字,但是我似乎找不到任何方法来排除最后 2 位数字。

【问题讨论】:

    标签: java regex


    【解决方案1】:

    不匹配 10 位,而是匹配 8 位和 2 位,捕获 2 位并将捕获的数字插入替换值中:

    str.replaceAll("(?<!\\d)\\d{8}(\\d{2})(?!\\d)", "XXXXXXXX$1")
    

    请参阅regex101.com 进行演示。

    【讨论】:

    • 做到了!花了我晚上更好的时间来完成这个。非常感谢!
    【解决方案2】:

    我不确定您是否可以使用单个正则表达式来做到这一点。您可能需要更复杂的 appendReplacement 机制,如下所示:

    Pattern p = Pattern.compile("(\\D)\\d{8}(\\d{2})(\\D?)");
    Matcher m = p.matcher(aString);
    StringBuffer sb = new StringBuffer();
    
    while(m.find())
    {
      m.appendReplacement(sb,"$1XXXXXXXX$2$3");
    }
    m.appendTail(sb);
    

    【讨论】:

    • 我的错。这里的代码是正确的,但是通过查看其他答案,显然可以在单个正则表达式中完成。
    【解决方案3】:

    这是另一种选择,我认为它更简单且更具可读性:

    str.replaceAll ("(\\D|\\b)\\d{8}(\\d{2}(\\D|\\b))", "$1XXXXXXXX$2");
    

    在模式的开头和结尾查找非数字或单词边界(在这种情况下,只是字符串的开头和结尾),然后在它们之间寻找 8 位数字 + 2 位数字。

    保存所有匹配的内容,除了 8 位数字,并重新插入反向引用。

    不过,在性能方面,我不确定它与 @Andreas 的响应相比如何。

    根据您的输入,实际上可以简化为:

    y = x.replaceAll ("(\\D)\\d{8}(\\d{2}(\\D|\\b))", "$1XXXXXXXX$2");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      相关资源
      最近更新 更多