【问题标题】:Masking part of the string with a regex用正则表达式屏蔽部分字符串
【发布时间】:2020-01-09 22:02:07
【问题描述】:

这个想法是像使用信用卡一样屏蔽字符串。可以用这一行代码来完成。它有效。但是我找不到在这种情况下使用的正则表达式的任何直接解释。

public class Solution {
    public static void main(String[] args) {

        String t1 = "518798673672531762319871";
        System.out.println(t1.replaceAll(".(?=.{4})", "*"));
    }
}

输出为:********************9871

【问题讨论】:

标签: java regex string replaceall


【解决方案1】:

解释正则表达式:

.(?=.{4})
  • .:匹配任意字符
  • (?=:前瞻条件的开始
    • .{4}:断言存在 4 个字符
  • ):前瞻条件结束

简单来说,它匹配输入中当前位置右侧有 4 个字符的任何字符。

替换为"*",这意味着对于inout 中的每个匹配字符,替换为单个* 字符,从而在前瞻条件匹配失败时替换信用卡号中除最后4 个字符之外的所有字符(因为我们赢了'当前位置前面没有 4 个字符)。

Read more on look arounds in regex

【讨论】:

    【解决方案2】:

    ?=.{4} 是一个积极的前瞻。它匹配括号内的模式(当前字符之后的下 4 位数字),但不将其包含在与所有其他字符匹配以替换为 *

    的主要结果中(括号外的 .

    假设您的正则表达式逐个字符地遍历输入字符。在第一个数字 (5) 上,它询问“是否有一个字符后跟 4 个其他字符?是的,好的.. 用 * 替换 [the 5]”

    它会重复这个直到第 9 个(从结尾算起第 4 个,此时“这之后还有 4 个字符吗?”问题变为“否”并且替换停止

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-11
      • 2011-10-13
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多