繁体   English   中英

如何在Java中替换匹配的字符串?

[英]How to replace matched character String in java?

我有一个关于找到匹配字符时如何替换String的问题。 在这种情况下,我读取了包含带有下划线标记的变量的java文件。 这里的java文件:

 public int[][] initArray(int rows, int cols, int init_value)
{
 int[][] _bb = (int[][])null;
 if ((rows > 1) && (cols > 1)) {
   _bb = new int[rows][cols];
   for (int _ii = 0; _ii < rows; _ii++) {
     for (int _ee = 0; _ee < cols; _ee++) {
       _bb[_ii][_ee] = init_value;
     }
   }
 } else {
   warning("Array length must be greater than zero!");
 }
 return _bb;
}

包含下划线的所有变量都将替换为generate string。 好吧,这就是我用来读取该文件并替换匹配的字符串的代码:

HashMap<String, String> map = new HashMap<String, String>();

if (line.contains(" _") && line.contains(";")) {

    String get = varname(line);

    RandomString r = new RandomString();

    String[] split = get.split("\\s+");
    String gvarname = split[0];

   ss = "_"+gvarname;
   map.put(ss, "l"+r.generateRandomString());

   for(String key: map.keySet()){
       if(line.contains(key)){
           line = line.replace(key, map.get(key));

       }
   }

然后,这是一种获取变量名称索引的方法:

String varname(String str){
    int startIdx = str.indexOf("_");
    int endIdx = str.indexOf(';');

    String content = str.substring(startIdx + 1, endIdx);
    return content;
}

实际上,上面的代码可以正常工作并替换一些变量名称,但是当我放空格示例_bb [_ii]不起作用而_bb [_ii]起作用时,注意到某些字符匹配。 我不知道如何,帮帮我!

谢谢

在您的第一个if -statement中,检查字符串是否包含" _" (带下划线的下划线)。

如果在您的source-java-file的以下行中

       _bb[_ii][_ee] = init_value;

_bb...用制表符缩进, <tab>_bb<space>_bb不匹配。 _ii_ee之前也没有前导空格,因此if返回false

如果在[_ii之间放置一个空格,则会找到<space>_ii的匹配项,并且if结果为true并执行您的替换代码。

如果您确定除了作为替换指示符之外,在源文本中将没有其他下划线的使用,则可以简单地从if条件中删除空格,而使用line.contains("_")

顺便说一句:您确定要检查该行必须包含;; 藏汉? 如果您的源文本包含while(_xx==true) {怎么办?

另外,由于

String[] split = get.split("\\s+");
String gvarname = split[0];

您的代码无法正确分割_bb[_ii][_ee] (即使那样,由于split[0]您也只能替换找到的第一个标识符,后续的标识符将被忽略)。 您的拆分将搜索空格,并且源代码行不包含任何空格。 再次,您可能可以更改此值并拆分为下划线(这将返回包含bb[ii][ee]数组),然后循环返回的每个数组元素,直到找到不能成为变量一部分的第一个字符标识符(例如,直到第一个非字母数字字符)。

_加上数组元素中直到该非字母数字字符的部分就是要替换的标识符。

使用正则表达式识别整个变量,此处使用\\b查找单词边界。

public class Obfuscate {

    private static final Pattern VAR_PATTERN = Pattern.compile("\\b_(\\w+)\\b");
    private final Map<String, String> renames = new HashMap<>();

    public String obfuscate(String sourceCode) {
        StringBuffer buf = new StringBuffer(sourceCode.length() + 100);
        Matcher m = VAR_PATTERN.matcher(sourceCode);
        while (m.find()) {
            String var = m.group(1);
            String newVar = renames.get(var);
            if (newVar == null) {
                newVar = randomVar();
                renames.put(var, newVar);
            }
            m.appendReplacement(buf, newVar);
        }
        m.appendTail(buf);
        return buf.toString();
    }
}

需要一个映射,以将相同的旧变量与相同的新名称进行匹配。

可能需要使用新名称的Set<String>来检查生成的名称是否重复。

您执行相同的var的replaceAll的方法也很好,但是需要全部读取。 可以重复上述方法(例如每行),因此将地图作为字段。

暂无
暂无

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

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