更有效的字符串替换方法来掩盖json文件(java)

时间:2017-09-27 11:52:20

标签: java regex masking

我有一些代码来掩盖json文件中的值。 但我觉得应该有一种更有效的方法来做到这一点。

这是我目前的代码:

private static final String STRING_REPLACEMENT = "$1 \"String\" $4";
private static final String FLOAT_REPLACEMENT = "$1 \"float\" $4";
private static final String INT_REPLACEMENT = "$1 \"Integer\" $4";
private static final String BOOL_REPLACEMENT = "$1 \"Boolean\" $4";

实际的掩码:

out = out.replaceAll("(\"\\w+\"\\s?:)\\s?\"((\\\\\"|[^\"])*\")", "$1 \"String\"");
out = out.replaceAll("(\"\\w+\"\\s?:)\\s?(\\d+\\.\\d+)", "$1 \"float\"");
out = out.replaceAll("(\"\\w+\"\\s?:)\\s?(\\d+)", "$1 \"Integer\"");
out = out.replaceAll("(\"\\w+\"\\s?:)\\s?(true|false)", "$1 \"Boolean\"");

out = out.replaceAll("(\\[\\s?)\"((\\\\\"|[^\"])*\")(\\s?,)", STRING_REPLACEMENT);
out = out.replaceAll("(,\\s?)\"((\\\\\"|[^\"])*\")(\\s?,)", STRING_REPLACEMENT);
out = out.replaceAll("(,\\s?)\"((\\\\\"|[^\"])*\")(\\s?\\])", STRING_REPLACEMENT);

out = out.replaceAll("(\\[\\s?)((\\d)+\\.\\d+)(\\s?,)", FLOAT_REPLACEMENT);
out = out.replaceAll("(,\\s?)((\\d)+\\.\\d+)(\\s?,)", FLOAT_REPLACEMENT);
out = out.replaceAll("(,\\s?)((\\d)+\\.\\d+)(\\s?\\])", FLOAT_REPLACEMENT);

out = out.replaceAll("(\\[\\s?)((\\d)+)(\\s?,)", INT_REPLACEMENT);
out = out.replaceAll("(,\\s?)((\\d)+)(\\s?,)", INT_REPLACEMENT);
out = out.replaceAll("(,\\s?)((\\d)+)(\\s?\\])", INT_REPLACEMENT);

out = out.replaceAll("(\\[\\s?)((true|false))(\\s?,)", BOOL_REPLACEMENT);
out = out.replaceAll("(,\\s?)((true|false))(\\s?,)", BOOL_REPLACEMENT);
out = out.replaceAll("(,\\s?)((true|false))(\\s?\\])", BOOL_REPLACEMENT);

有人有任何建议如何改善这一点。我知道我可以对正则表达式进行分组,但我担心这会影响mutch的可读性。而且我注意到如果我将3个正则表达式线组合成一个更多?在它中,它并不总是以正确的方式找到它,因此掩盖失败。

1 个答案:

答案 0 :(得分:1)

您可以使用正则表达式/替换执行HashMap并迭代以应用您的replaceAll

例如

import java.util.HashMap;
import java.util.Map;

public class Test {

    private static final String STRING_REPLACEMENT = "$1 \"String\" $4";
    private static final String FLOAT_REPLACEMENT = "$1 \"float\" $4";
    private static final String INT_REPLACEMENT = "$1 \"Integer\" $4";
    private static final String BOOL_REPLACEMENT = "$1 \"Boolean\" $4";
    private static final Map<String,String> patterns;
    static {
        patterns = new HashMap<>();
        patterns.put("(\"\\w+\"\\s?:)\\s?\"((\\\\\"|[^\"])*\")", "$1 \"String\"");
        patterns.put("(\"\\w+\"\\s?:)\\s?(\\d+\\.\\d+)", "$1 \"float\"");
        patterns.put("(\"\\w+\"\\s?:)\\s?(\\d+)", "$1 \"Integer\"");
        patterns.put("(\"\\w+\"\\s?:)\\s?(true|false)", "$1 \"Boolean\"");
        patterns.put("(\\[\\s?)\"((\\\\\"|[^\"])*\")(\\s?,)", STRING_REPLACEMENT);
        patterns.put("(,\\s?)\"((\\\\\"|[^\"])*\")(\\s?,)", STRING_REPLACEMENT);
        patterns.put("(,\\s?)\"((\\\\\"|[^\"])*\")(\\s?\\])", STRING_REPLACEMENT);
        patterns.put("(\\[\\s?)((\\d)+\\.\\d+)(\\s?,)", FLOAT_REPLACEMENT);
        patterns.put("(,\\s?)((\\d)+\\.\\d+)(\\s?,)", FLOAT_REPLACEMENT);
        patterns.put("(,\\s?)((\\d)+\\.\\d+)(\\s?\\])", FLOAT_REPLACEMENT);
        patterns.put("(\\[\\s?)((\\d)+)(\\s?,)", INT_REPLACEMENT);
        patterns.put("(,\\s?)((\\d)+)(\\s?,)", INT_REPLACEMENT);
        patterns.put("(,\\s?)((\\d)+)(\\s?\\])", INT_REPLACEMENT);
        patterns.put("(\\[\\s?)((true|false))(\\s?,)", BOOL_REPLACEMENT);
        patterns.put("(,\\s?)((true|false))(\\s?,)", BOOL_REPLACEMENT);
        patterns.put("(,\\s?)((true|false))(\\s?\\])", BOOL_REPLACEMENT);
    }
    public void test() {
        String out="your string";
        for(Map.Entry<String, String> pattern :patterns.entrySet()){
            out = out.replaceAll(pattern.getKey(), pattern.getValue());
        }
    }
}

但是,最好使用api反序列化,更新值并重新序列化json