2013-01-10 15 views
0

我在字符串中有一些XML,並希望用「」替換所有id屬性值,其中id屬性值以「widget」開頭。使用Java模式的一些字符和數字的正則表達式

這是我輸入的xml:

<panel height="24" id="sd1" layout="vertical" left_padding="12" spacing="12" stereotype="directions" width="790" x="0" y="79"> 
<text_widget halign="left" id="widget5019721000" width="761"/> 
<text_widget halign="left" id="widget5019501000" width="761"/> 
<text_widget halign="left" id="widget5019711000" width="761"/> 
<text_widget halign="left" id="widget5019752000" width="761"/> 
</panel> 

和輸出XML應該有如下:

String xmlStr = this.getXmlString(); 
Pattern pattern = Pattern.compile(xmlStr); 
Matcher matcher = pattern.matcher(\"id="widget[0-9]\"); 

怎麼辦:

<panel height="24" id="sd1" layout="vertical" left_padding="12" spacing="12" stereotype="directions" width="790" x="0" y="79"> 
<text_widget halign="left" id="" width="761"/> 
<text_widget halign="left" id="" width="761"/> 
<text_widget halign="left" id="" width="761"/> 
<text_widget halign="left" id="" width="761"/> 
</panel> 

我用下面的代碼嘗試我在Java中使用正則表達式來執行此操作嗎?

+3

有你處理XML與正則表達式的一個原因?使用XML有更好的方法。 – JLRishe

+1

使用正則表達式來修改xml不是一個好主意。嘗試使用XML解析器,可能Java DOM解析器是最適合你的 – Mircea

回答

0

雖然代碼中有錯誤,但Pattern.compile接收的字符串參數是正則表達式模式,而不是源字符串。這是正確的代碼。

Pattern pattern = Pattern.compile("id=\\\"widget\d*") 
Matcher match = pattern.matcher(xmlStr) 
String result = match.replaceAll("id=\\\"") 
+0

你對模式和匹配器的使用是正確的。但是去除'widget'之後的數字呢?你的代碼無法處理。 'id =「widget5019721000」' - >'id =「」'。 –

0

String result = xml.replaceAll("id=\\\"widget[0-9]*", "id=\"");

相反,你也可以使用XML處理。從www.jdom.org下載JDOM並將包含的jdom-2.0.4.jar添加到您的類路徑中。然後使用下面的代碼:

import java.io.StringReader; 
import java.util.List; 

import org.jdom2.Document; 
import org.jdom2.Element; 
import org.jdom2.input.SAXBuilder; 
import org.jdom2.output.Format; 
import org.jdom2.output.XMLOutputter; 

public class Test { 
public static void main(String[] args) throws Exception { 
    String xml = "<panel height=\"24\" id=\"sd1\" layout=\"vertical\" left_padding=\"12\" spacing=\"12\" stereotype=\"directions\" width=\"790\" x=\"0\" y=\"79\">" 
       +"<text_widget halign=\"left\" id=\"widget5019721000\" width=\"761\"/>" 
       +"<text_widget halign=\"left\" id=\"widget5019501000\" width=\"761\"/>" 
       +"<text_widget halign=\"left\" id=\"widget5019711000\" width=\"761\"/>" 
       +"<text_widget halign=\"left\" id=\"widget5019752000\" width=\"761\"/>" 
       +"</panel>"; 

    SAXBuilder builder = new SAXBuilder(); 
    Document doc = builder.build(new StringReader(xml)); 

    List<Element> textWidgetElements = doc.getRootElement().getChildren("text_widget"); 
    for (Element e : textWidgetElements) { 
     if (e.getAttributeValue("id").startsWith("widget")) { 
      e.setAttribute("id", ""); 
     } 
    } 

    XMLOutputter out = new XMLOutputter(); 
    out.setFormat(Format.getPrettyFormat()); 
    String result = out.outputString(doc); 

    System.out.println(result); 
} 

}

+0

JLRishe:使用正則表達式來處理它有什麼更好的方法 – rand

+0

Thankx Alex我會嘗試使用您的代碼 – rand

相關問題