2

次のようなタグが大量に含まれる入力 HTML ファイルを読み込んでいます。

<h2 id="head-3d7e87e90500d3645e1f578a2b0fd6b4f7bd4ccf">

これhead-3d7e87e90500d3645e1f578a2b0fd6b4f7bd4ccfはランダムな値です。

たとえば、ArrayListに必要なすべての置換を行って、それらを次のように見せます。

<h2 id="correctAnchor"> 

しかし、HTML (文字列として解析) を & でループしArrayListますが、常に最後の値を置き換えます:

    for (String temp2 : myAnchorLinks) {
        Pattern h2Pattern = Pattern.compile("<h2.*?>");
        Matcher h2Matcher = h2Pattern.matcher(replaceAllTags);
        if (h2Matcher.find()){
            replaceAllTags = replaceAllTags.replace("<h2 id=.*?>", "<h2 id="+temp2+">");        
        }

     }

私が間違っていること、またはより良いアプローチがありますか?

「ウィキとは?

すべての HTML を投稿することはできませんが、次のようになります。

ArrayList = {#blah1, #blah2, #blah3};

4

5 に答える 5

1

がある場合は、舞台裏で新しい を作成するメソッドをMatcher使用する代わりに、それを使用する必要があります。StringMatcher

Pattern h2Pattern = Pattern.compile("<h2.*?>");
Matcher h2Matcher = h2Pattern.matcher("");
for (String temp2 : myAnchorLinks) {
    h2Pattern.reset(replaceAllTags);
    replaceAllTags = h2Matcher.replaceAll("<h2 id="+temp2+">");
}

更新:私はあなたが何をしようとしているのか知っていると思います:

Pattern h2Pattern = Pattern.compile("<h2.*?>");
Matcher m=p.matcher(replaceAllTags);
StringBuffer sb=new StringBuffer();
for(Iterator<String> it=myAnchorLinks.iterator(); it.hasNext() && m.find(); ) {
  m.appendReplacement(sb, "<h2 id="+it.next()+">");
}
m.appendTail(sb);
replaceAllTags=sb.toString();

これにより、パターンの出現ごとにString、リストから別のパターンが割り当てられます。ただし、リスト内の一致数と要素数が一致しない場合の対処方法に注意する必要があります。私の例では、小さい方で停止します。

于 2013-09-18T14:51:29.943 に答える
0

おそらく、あなたは次のようなことをしようとしています:

// Original String
String HTML="aslasasd <h2 id=\"head-abcdefg\">   <h2 id=\"head-hij5345345345n\">";

// Ids to replace secuentially
String[] ids ={"#id1","#id2"};

// Replace pattern
Pattern pattern = Pattern.compile("<h2[^<>\"']id=\"([^\"]*)\"");
Matcher matcher = pattern.matcher(HTML);
int i = 0;

// Loop for each id that match and replace the ramdom id with the next
// id in the list.
while(matcher.find()){
    HTML = HTML.replace(matcher.group(1),ids[i]); // replace Id
    i++;
    if (i > ids.length){
        break; // No more ids to replace
    }
}

// Replaced String
System.out.println(HTML);
于 2013-09-19T07:19:29.437 に答える