繁体   English   中英

Java正则表达式在字符串中查找子字符串

[英]Java regex find substring in string

我在应用程序启动后打印属性。 我需要隐藏密码的值。 我添加了一个新属性,如:

secrets:my.first.password,my.second.password

并在打印前检查每个属性。 如果secrets包含密钥,我将 value 替换为 ***。 例如,我有这些属性:

my.first.name:some name
my.first.password:123
my.second.name:second name
my.second.password:456
secrets:my.first.password,my.second.password

我将打印下一行:

my.first.name:some name
my.first.password:***
my.second.name:second name
my.second.password:***
secrets:my.first.password,my.second.password

我用这个代码来做(protectedProperties = splitted secrets property):

protected String getViewableValue(String key, Object value) {
        if (protectedProperties.contains(key)) {
            return key + ":***";
        } else {
            return key + ":" + value;
        }
    }

现在我需要添加一个新选项。 我不仅需要隐藏属性的完整键,还需要隐藏掩码。 例如:

secrets:my.first.password,*password* 

这意味着所有带有密钥的属性都应该隐藏密码 我写了这段代码并且它有效(我之前从单词的开头和结尾删除了 *):

protected String getViewableValue(String key, Object value) {
        for (String property : protectedProperties) {
            if (key.contains(property)) return key + ":***";
        }

        return key + ":" + value;
    }

但我不喜欢这个解决方案。 我在考虑正则表达式。 我可以将我的解决方案更改为正则表达式吗?

用正则表达式替换全部 - 用变量和子字符串替换

正则表达式:

"my\\.(?:first|second)\\.password:)\\S+"

上下文中的正则表达式:

public static void main(String[] args) {
    String input = "my.first.name:some name\n"
            + "my.first.password:123\n"
            + "my.second.name:second name\n"
            + "my.second.password:456\n"
            + "secrets:my.first.password,my.second.password\n";

    String result = input
            .replaceAll("(my\\.(?:first|second)\\.password:)\\S+","$1:***");
    System.out.println(result);
}

输出:

my.first.name:some name
my.first.password::***
my.second.name:second name
my.second.password::***
secrets:my.first.password,my.second.password

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM