Java 如何提取子字符串(html)和另一个子字符串(将用于正则表达式)并以适当的格式放置?

Java 如何提取子字符串(html)和另一个子字符串(将用于正则表达式)并以适当的格式放置?,java,regex,jsp,Java,Regex,Jsp,我有一个巨大的字符串,其中包含以下代码,我需要以这样的方式提取contains,如果有任何HTML来附加它,如果有任何子字符串包含以下模式,则从中创建一个链接,并以适当的格式和位置继续 例如: <div id="contentPermission"> [[MI44,MI304,MI409,MI45,MI264,MI108,MI46,MI47,MI48,MI49,MI50,MI51,MI52,MI58,MI530]] </div> <div>&n

我有一个巨大的字符串,其中包含以下代码,我需要以这样的方式提取contains,如果有任何HTML来附加它,如果有任何子字符串包含以下模式,则从中创建一个链接,并以适当的格式和位置继续

例如:

<div id="contentPermission"> 
  [[MI44,MI304,MI409,MI45,MI264,MI108,MI46,MI47,MI48,MI49,MI50,MI51,MI52,MI58,MI530]]

</div>
<div>&nbsp;</div>

<p>&nbsp;</p>

<div>&nbsp;</div>

<p>&nbsp;</p>

<p>[[LP1137]]</p>
所以外面应该是这样的:

<div id="contentPermission"> 

  <a href="index?page=content&id=MI44></a>

  <a href="index?page=content&id=MI304></a>

  <a href="index?page=content&id=MI409></a>

 ......

 ......
</div>
<div>&nbsp;</div>

<p>&nbsp;</p>

<div>&nbsp;</div>

<p>&nbsp;</p>

<p><a href="index?page=content&id=LP1137></a></p>

......
......

解决方案

public static void main(String[] args) {

    StringBuilder str = new StringBuilder("<div id=\"contentPermission\">"
            + "  [[MI44,MI304,MI409,MI45,MI264,MI108,MI46,MI47,MI48,MI49,MI50,MI51,MI52,MI58,MI530]]"
            + "</div><div>&nbsp;</div><p>&nbsp;</p><div>&nbsp;</div><p>&nbsp;</p><p>[[LP1137]]</p>");

    System.out.println("Before " + str.toString()+"\n\n\n");

    Pattern pattern = Pattern.compile("\\[{2}.[^\\]]*\\]{2}");
    Matcher matcher = pattern.matcher(str);

    while(matcher.find()){

        String codes = matcher.group(0);
        codes = codes.substring(2, codes.length()-2);

        StringBuilder urls = new StringBuilder();
        for(String code:codes.split(",")){
            urls.append("<a href=\"index?page=content&id=" + code + "></a>\n");
        }
        str = new StringBuilder(matcher.replaceFirst(urls.toString()));
        matcher = pattern.matcher(str);
    }

    System.out.println("Replaced " + str.toString());
}
publicstaticvoidmain(字符串[]args){
StringBuilder str=新的StringBuilder(“”)
+[[MI44、MI304、MI409、MI45、MI264、MI108、MI46、MI47、MI48、MI49、MI50、MI51、MI52、MI58、MI530]]
+“[[LP1137]]

”; System.out.println(“在”+str.toString()+“\n\n\n”之前); Pattern=Pattern.compile(“\\[{2}.[^\\]]*\\]{2}”); Matcher-Matcher=pattern.Matcher(str); while(matcher.find()){ 字符串代码=匹配器组(0); codes=codes.substring(2,codes.length()-2); StringBuilder URL=新的StringBuilder(); for(字符串代码:codes.split(“,”)){ URL.append(“\n”); } str=newStringBuilder(matcher.replaceFirst(url.toString()); matcher=pattern.matcher(str); } System.out.println(“替换的”+str.toString()); }
另一个仅使用正则表达式的解决方案(无拆分/循环或子字符串):

String content=“[MI44、MI304、MI409、MI45、MI264、MI108、MI46、MI47、MI48、MI49、MI50、MI51、MI52、MI58、MI530][[LP1137]];

模式p=模式。编译(“(?感谢Thomas为您提供的解决方案!!仅供参考,while是一个循环。您的代码看起来很干净,但如果您查看我的答案的工作情况以及您使用的方法执行的内部计算,它们具有类似的复杂性。感谢Rajiv。它工作了。但我无法理解您的正则表达式模式。请您详细说明并向我解释一下。谢谢gainthis正则表达式由3部分组成:1.[{2}->搜索字符“[”,{}中的数字表示字符“[”2..[^]]]的两次出现->获取从“[[”开始的所有字符,直到找到字符“]”为止。这是必需的,因为没有这个字符的结果如下所示[[MI44,MI304,MI…MI48,MI49,MI50,MI51,MI52,MI58,MI530]获取字符直到“]]
public static void main(String[] args) {

    StringBuilder str = new StringBuilder("<div id=\"contentPermission\">"
            + "  [[MI44,MI304,MI409,MI45,MI264,MI108,MI46,MI47,MI48,MI49,MI50,MI51,MI52,MI58,MI530]]"
            + "</div><div>&nbsp;</div><p>&nbsp;</p><div>&nbsp;</div><p>&nbsp;</p><p>[[LP1137]]</p>");

    System.out.println("Before " + str.toString()+"\n\n\n");

    Pattern pattern = Pattern.compile("\\[{2}.[^\\]]*\\]{2}");
    Matcher matcher = pattern.matcher(str);

    while(matcher.find()){

        String codes = matcher.group(0);
        codes = codes.substring(2, codes.length()-2);

        StringBuilder urls = new StringBuilder();
        for(String code:codes.split(",")){
            urls.append("<a href=\"index?page=content&id=" + code + "></a>\n");
        }
        str = new StringBuilder(matcher.replaceFirst(urls.toString()));
        matcher = pattern.matcher(str);
    }

    System.out.println("Replaced " + str.toString());
}
String content = "<div id=\"contentPermission\">[[MI44,MI304,MI409,MI45,MI264,MI108,MI46,MI47,MI48,MI49,MI50,MI51,MI52,MI58,MI530]]</div><div>&nbsp;</div><p>&nbsp;</p><div>&nbsp;</div><p>&nbsp;</p><p>[[LP1137]]</p>";

Pattern p = Pattern.compile("(?<=\\[\\[).*?(?=\\]\\])");
Matcher m = p.matcher(content);

while(m.find())
  content = content.replaceFirst("(\\[\\[).*?(\\]\\])", m.group().replaceAll("(\\w+)(,\\s*\\d*)*", "<a href=\"index?page=content&id=$1\"></a>"));