android java,regex条件替换匹配的子内容(比如javascript';s str.replace(pattern,function(){})

android java,regex条件替换匹配的子内容(比如javascript';s str.replace(pattern,function(){}),java,android,regex,callback,Java,Android,Regex,Callback,需要使用正则表达式在Java中进行条件替换(如果使用javascript进行替换,请参见下面的示例)。找不到使用Java进行替换的简单方法。有人知道在Java中是否有等效的函数/回调函数进行替换吗 问题是在Android上,它需要找到一个img标记与其中的某个标记匹配,如果找到该标记,则需要修改src部分。问题是img标记可能也有不同的属性,它们应该保留。它们可能位于img标记内的随机位置。src未知,但只知道它应该是mod化了。 因此,它在img标记中查找token属性并修改其中的src部分

需要使用正则表达式在Java中进行条件替换(如果使用javascript进行替换,请参见下面的示例)。找不到使用Java进行替换的简单方法。有人知道在Java中是否有等效的函数/回调函数进行替换吗

问题是在Android上,它需要找到一个img标记与其中的某个标记匹配,如果找到该标记,则需要修改src部分。问题是img标记可能也有不同的属性,它们应该保留。它们可能位于img标记内的随机位置。src未知,但只知道它应该是mod化了。 因此,它在img标记中查找token属性并修改其中的src部分

(img attribute1token=“这是标记”style=“width:100px;…”src=”http://......“someOtherAttributes/)

(imgsrc=”http://......“attribute1token=”这是令牌“someOtherAttributes style=“width:100px;…”/)

结果只会修改src,如 (imgsrc=”http://....../pathabc“attribute1 token=”这是token“someOtherAttributes style=“width:100px;…”/)

在javascript中,您可能需要这样做

var passedInToken = "this is the token";
var srcPath = "/pathabc";
var regex = new RegExp("(?:<img\\s)([^<]*)(?:token=\""+passedInToken+"\"\\s*)([^>]*)>", "gi");
var foundToken = regex.test(testSourceHtmlString);
if (foundToken) {
  var testSourceHtmlString = testSourceHtmlString.replace(regex, function(matchStr, grp1, grp2){
    var attributeStrToBeReserved = grp1+" "+grp2;
    var findSrcRegex = new RegExp("(src=\".*?\")");
    if (findSrcRegex.test(attributeStrToBeReserved)){
      attributeStrToBeReserved = attributeStrToBeReserved.replace(srcRegex, function(match, g1){
        return g1 + srcPath;
      });
    }
    return "<img token=\""+passedInToken+"\""+attributeStrToBeReserved+">";

  });
}
var passedInToken=“这是令牌”;
var srcPath=“/pathabc”;
var regex=新的RegExp(“(?:”;
});
}

看起来使用matcher可能有助于达到同样的效果。有更好的方法吗

    String passedInToken = "this is the token";
    String srcPath = "/pathabc";
    StringBuffer sb = new StringBuffer();
    String srcPatternString = "(src=\".*?\")";
    Pattern srcPattern = Pattern.compile(srcPatternString);

    String patternString = "(?:<img\\s)([^<]*)(?:token=\""+passedInToken+"\"\\s*)([^>]*)>";
    Pattern pattern = Pattern.compile(patternString);
    Matcher matcher = pattern.matcher(htmlStr);

     while(matcher.find()) {

        String srcPart = matcher.group(1) + " " + matcher.group(2);

        StringBuffer srcSb = new StringBuffer();
        Matcher strMatcher = srcPattern.matcher(srcPart);
        while (strMatcher.find()) {
                strMatcher.appendReplacement(srcSb, strMatcher.group(1)+ srcPath);
        }
        strMatcher.appendTail(srcSb);
                String srcStr = "<img \"" + srcSb.toString() + ">";
        matcher.appendReplacement(sb, srcStr);
    }
    matcher.appendTail(sb);
    String newHtmlStr = sb.toString();
String passedInToken=“这是令牌”;
字符串srcPath=“/pathabc”;
StringBuffer sb=新的StringBuffer();
字符串srcPatternString=“(src=\”*?\””;
Pattern srcPattern=Pattern.compile(srcPatternString);
字符串模式字符串=“(?:”;
匹配器更换(sb、srcStr);
}
(某人);
字符串newHtmlStr=sb.toString();

看起来使用matcher可能有助于达到同样的效果。有更好的方法吗

    String passedInToken = "this is the token";
    String srcPath = "/pathabc";
    StringBuffer sb = new StringBuffer();
    String srcPatternString = "(src=\".*?\")";
    Pattern srcPattern = Pattern.compile(srcPatternString);

    String patternString = "(?:<img\\s)([^<]*)(?:token=\""+passedInToken+"\"\\s*)([^>]*)>";
    Pattern pattern = Pattern.compile(patternString);
    Matcher matcher = pattern.matcher(htmlStr);

     while(matcher.find()) {

        String srcPart = matcher.group(1) + " " + matcher.group(2);

        StringBuffer srcSb = new StringBuffer();
        Matcher strMatcher = srcPattern.matcher(srcPart);
        while (strMatcher.find()) {
                strMatcher.appendReplacement(srcSb, strMatcher.group(1)+ srcPath);
        }
        strMatcher.appendTail(srcSb);
                String srcStr = "<img \"" + srcSb.toString() + ">";
        matcher.appendReplacement(sb, srcStr);
    }
    matcher.appendTail(sb);
    String newHtmlStr = sb.toString();
String passedInToken=“这是令牌”;
字符串srcPath=“/pathabc”;
StringBuffer sb=新的StringBuffer();
字符串srcPatternString=“(src=\”*?\””;
Pattern srcPattern=Pattern.compile(srcPatternString);
字符串模式字符串=“(?:”;
匹配器更换(sb、srcStr);
}
(某人);
字符串newHtmlStr=sb.toString();

如果有一个规范的SO答案,讨论使用正则表达式处理HTML/XML的危险。如果只有一个规范的SO答案,讨论使用正则表达式处理HTML/XML的危险。