使用Java模式类的某些字符和数字的正则表达式
我在字符串中有一些XML,希望用“”替换所有id属性值,其中id属性值以“widget”开头 以下是我的输入xml:使用Java模式类的某些字符和数字的正则表达式,java,xml,pattern-matching,Java,Xml,Pattern Matching,我在字符串中有一些XML,希望用“”替换所有id属性值,其中id属性值以“widget”开头 以下是我的输入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=
<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>
如何在Java中使用正则表达式来实现这一点?但是代码中有错误,
模式。编译
接收字符串参数,它是正则表达式模式,而不是源字符串。这是正确的代码
Pattern pattern = Pattern.compile("id=\\\"widget\d*")
Matcher match = pattern.matcher(xmlStr)
String result = match.replaceAll("id=\\\"")
String result=xml.replaceAll(“id=\\\”小部件[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);
}
导入java.io.StringReader;
导入java.util.List;
导入org.jdom2.Document;
导入org.jdom2.Element;
导入org.jdom2.input.SAXBuilder;
导入org.jdom2.output.Format;
导入org.jdom2.output.XMLOutputter;
公开课考试{
公共静态void main(字符串[]args)引发异常{
字符串xml=“”
+""
+""
+""
+""
+"";
SAXBuilder=新SAXBuilder();
documentdoc=builder.build(新的StringReader(xml));
列出textWidgetElements=doc.getRootElement().getChildren(“文本”小部件);
对于(元素e:textWidgetElements){
如果(例如getAttributeValue(“id”).startsWith(“小部件”)){
e、 setAttribute(“id”,”);
}
}
XMLOutputter out=新的XMLOutputter();
out.setFormat(Format.getPrettyFormat());
字符串结果=out.outputString(doc);
系统输出打印项次(结果);
}
}使用正则表达式处理XML有什么原因吗?使用XML有更好的方法。使用正则表达式修改XML不是一个好主意。尝试XML解析器,可能Java DOM解析器最适合您。您对模式和匹配器的使用是正确的。但是删除小部件后面的数字怎么样?你的代码不能处理这个问题id=“widget5019721000”
->id=”“
。JLRishe:不使用正则表达式处理它的更好方法是什么
Pattern pattern = Pattern.compile("id=\\\"widget\d*")
Matcher match = pattern.matcher(xmlStr)
String result = match.replaceAll("id=\\\"")
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);
}