[英]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.