用正则表达式屏蔽部分字符串
Masking part of the string with a regex
我们的想法是像处理信用卡一样屏蔽字符串。一行代码就可以搞定。它有效。但是,我找不到对本例中使用的正则表达式的任何直接解释。
public class Solution {
public static void main(String[] args) {
String t1 = "518798673672531762319871";
System.out.println(t1.replaceAll(".(?=.{4})", "*"));
}
}
输出为:********************9871
正则表达式的解释:
.(?=.{4})
.
:匹配任意字符
(?=
:先行条件的开始
.{4}
:断言存在 4 个字符
)
:先行条件结束
简单来说,它匹配输入中当前位置右侧有 4 个字符的任何字符。
替换为"*"
,即对于inout中的每个匹配字符,替换为单个*
字符,从而在先行条件失败时替换信用卡号中除最后4个字符外的所有字符匹配(因为我们不会在当前位置之前有 4 个字符)。
?=.{4}
是正向预测。它匹配括号内的模式(当前字符后的下一个 4 位数字)而不将其包含在主要结果中(括号外的 .
)匹配所有其他字符以替换为 *
假设您的正则表达式逐个字符地遍历输入。在第一个数字 (5) 上,它询问 "is there a single char followed by 4 other chars? yes, ok.. replace [the 5] with *"
重复此操作直到第 9 个(倒数第 4 个,此时 "is there another 4 characters after this?" 问题变为 "no" 并且替换停止
我们的想法是像处理信用卡一样屏蔽字符串。一行代码就可以搞定。它有效。但是,我找不到对本例中使用的正则表达式的任何直接解释。
public class Solution {
public static void main(String[] args) {
String t1 = "518798673672531762319871";
System.out.println(t1.replaceAll(".(?=.{4})", "*"));
}
}
输出为:********************9871
正则表达式的解释:
.(?=.{4})
.
:匹配任意字符(?=
:先行条件的开始.{4}
:断言存在 4 个字符
)
:先行条件结束
简单来说,它匹配输入中当前位置右侧有 4 个字符的任何字符。
替换为"*"
,即对于inout中的每个匹配字符,替换为单个*
字符,从而在先行条件失败时替换信用卡号中除最后4个字符外的所有字符匹配(因为我们不会在当前位置之前有 4 个字符)。
?=.{4}
是正向预测。它匹配括号内的模式(当前字符后的下一个 4 位数字)而不将其包含在主要结果中(括号外的 .
)匹配所有其他字符以替换为 *
假设您的正则表达式逐个字符地遍历输入。在第一个数字 (5) 上,它询问 "is there a single char followed by 4 other chars? yes, ok.. replace [the 5] with *"
重复此操作直到第 9 个(倒数第 4 个,此时 "is there another 4 characters after this?" 问题变为 "no" 并且替换停止