java 是否有一个正则表达式来屏蔽每个单词中除了第一个和最后一个字符之外的所有字符

mitkmikd  于 2023-04-19  发布在  Java
关注(0)|答案(3)|浏览(94)

例如,我有下面的单词列表要屏蔽。

India
Australia
North America
South America
White House building

我需要一个像下面这样的输出。

Ixxxa
Axxxxxxxa
Nxxxh Axxxxxa
Sxxxh Axxxxxa
Wxxxe Hxxxe bxxxxxxg

使用下面的表达式,我可以屏蔽最后一个字符,包括空格。

return input.replaceAll("[\\s()]+", " ").replaceAll("\\d(?=(?:\\D*\\d){4})","X");
camsedfj

camsedfj1#

要匹配一个非空白字符,除了“外部”字符,你可以在左边和右边Assert一个非空白字符\S

(?<=\S)\S(?=\S)

在 java

(?<=\\S)\S(?=\\S)

参见regex demoJava demo
Java示例:

String regex = "(?<=\\S)\\S(?=\\S)";
    String string = "India\n"
 + "Australia\n"
 + "North America\n"
 + "South America\n"
 + "White House building\n"
 + "a\n"
 + "ab\n"
 + "abc\n"
 + "tthis123_isatest\n"
 + "!@#$%";

    String result = string.replaceAll(regex, "x");
    System.out.println(result);

输出

Ixxxa
Axxxxxxxa
Nxxxh Axxxxxa
Sxxxh Axxxxxa
Wxxxe Hxxxe bxxxxxxg
a
ab
axc
txxxxxxxxxxxxxxt
!xxx%
kzmpq1sx

kzmpq1sx2#

上面的建议张贴在下面的正则表达式帮助解决了这个问题。
(?〈=\S)\S(?=\S)
我用不同的组合测试了它的字符和数字。这解决了我的要求...谢谢。

6kkfgxo0

6kkfgxo03#

我不确定正则表达式,如果你想用OOP的方式来做--但可能效率不高--你可以按行和词来分割,并以编程方式屏蔽它们:

class MaskedText {
    private final String maskedString;
    private final char maskChar;

    public MaskedText(String maskedString) {
        this(maskedString, 'x');
    }

    public MaskedText(String maskedString, char maskChar) {
        this.maskChar = maskChar;
        this.maskedString = Arrays.stream(maskedString.split("\n"))
                .map(this::maskLine)
                .collect(Collectors.joining("\n"));
    }

    private String maskLine(String rawLine) {
        return Arrays.stream(rawLine.split(" "))
                .map(this::maskWord)
                .collect(Collectors.joining(" "));
    }

    private String maskWord(String rawWord) {
        return rawWord.charAt(0)
                + String.valueOf(maskChar).repeat(rawWord.length() - 2)
                + rawWord.charAt(rawWord.length() - 1);
    }

    @Override
    public String toString() {
        return maskedString;
    }
}

你可以这样使用它:

@Test
void test() {
    String txt = """
            India
            Australia
            North America
            South America
            White House building
            """;
    MaskedText masked = new MaskedText(txt);

    assertThat(masked.toString()).isEqualTo("""
            "Ixxxa
            Axxxxxxxa
            Nxxxh Axxxxxa
            Sxxxh Axxxxxa
            Wxxxe Hxxxe bxxxxxxg"
            """);
}

或直接在日志中:log.info("account: {}", new MaskedText(account))

相关问题