String mask = "xxx/13xx/xxx";
var pattern = Pattern.compile("^" + mask.replace("x", "(.)") + "$");
String text = "222/1300/777";
var match = pattern.matcher(text);
if (match.find()) {
var stringBuilder = new StringBuilder();
for (int i = 1; i <= match.groupCount(); i++) {
stringBuilder.append(match.group(i));
}
String result = stringBuilder.toString();
System.out.println(result);
} else {
System.out.println("Ничего не найдено (строка не соответствует маске)");
}
结论:
22200777
另一种选择 - 我们只是进入一个循环,比较掩码和文本的符号,然后将对应于 x 的内容添加到结果中(这里的代码证明比某种复杂的逻辑更有效):
private static String getByMask(String text, String mask) {
var result = new StringBuilder();
if (text.length() != mask.length()) {
throw new RuntimeException("Длина текста не соответствует маске");
}
for (int i = 0; i < mask.length(); i ++ ) {
if (mask.charAt(i) == 'x') {
result.append(text.charAt(i));
} else if (mask.charAt(i) != text.charAt(i)) {
throw new RuntimeException(
String.format("Символ на позиции %d ('%c') не соответствует маске (символ '%c')",
i, text.charAt(i), mask.charAt(i)));
}
}
return result.toString();
}
public static void main(String[] args) {
String mask = "xxx/13xx/xxx";
String text = "222/1300/777";
System.out.println(getByMask(text, mask));
}
通过正则表达式:将所有x替换为
(.)
,然后作为正则表达式匹配,拉出所有组:结论:
另一种选择 - 我们只是进入一个循环,比较掩码和文本的符号,然后将对应于 x 的内容添加到结果中(这里的代码证明比某种复杂的逻辑更有效):
使用 Stream API 和方法的选项
Matcher::results()
/Matcher::replaceAll()
x
掩码中的字符变成了组(.)
x
它变为(.)
x
使用 "$1$2...$N"替换所有Matcher::replaceAll
字符,不会x
删除所有字符。如果模式不匹配,则返回原始字符串