Java 正则表达式太饿了
我正在寻找正则表达式,但找不到 像这样解析文本文件Java 正则表达式太饿了,java,regex,Java,Regex,我正在寻找正则表达式,但找不到 像这样解析文本文件 <resource name="/_op_sox/Project/Default/ICDocumentation/Evaluation/Allianz/Allianz SE/Eval_01241.txt" inheritAcls="true"> <bundle name="AZEvaluation"> <property name="End
<resource name="/_op_sox/Project/Default/ICDocumentation/Evaluation/Allianz/Allianz SE/Eval_01241.txt"
inheritAcls="true">
<bundle name="AZEvaluation">
<property name="End Date">
</property>
<property name="Evaluation Type">
<propertyValue name="RCSA"/>
</property>
</bundle>
</resource>
<resource name="/_op_sox/Project/Default/ICDocumentation/Evaluation/Allianz/Allianz SE/Eval_01481.txt"
inheritAcls="true">
<bundle name="AZEvaluation">
<property name="End Date">
</property>
<property name="Evaluation Type">
<propertyValue name="TRA"/>
</property>
</bundle>
</resource>
<resource name="/_op_sox/Project/Default/ICDocumentation/Evaluation/Allianz/Allianz SE/Eval_01362.txt"
inheritAcls="true">
<bundle name="AZEvaluation">
<property name="End Date">
</property>
<property name="Evaluation Type">
<propertyValue name="RCSA"/>
</property>
</bundle>
</resource>
我现在的正则表达式非常匹配
<resource.+?<propertyValue name="RCSA".+?</resource>
正如E先生指出的,这根本不是从XML文件读取数据的最佳方式。更不用说,如果你突然不得不处理嵌套元素!但是,这将与资源中propertyValue的name属性相匹配
<resource.+?<propertyValue name=(["'])([^"']*)\1.+?</resource>
我用这个表达式解决了这个问题:使用XML解析器。简单的问题-为什么不使用XML工具来解决这个问题?regexp不适合XML或HTMLW为什么不使用Jsoup?找到第一个resource
元素很简单。您不使用XML解析器和XPath的具体原因是什么?我不需要name属性的内容。如果属性值的名称属性是RCSA,我想替换整个资源元素。我看,无论如何,考虑使用XML解析器,遍历孩子。即使以这种方式工作,这也不是一个长期的解决方案,最终在某些XML文件上注定会失败。它有很多不同的标签,我在这里没有提到。因此,fare使用了5个不同的正则表达式来减少文件或更改某些内容。编写XML解析将花费我几个小时的时间……幸运的是,它以前就已经完成了:仅仅因为提到了“使用XML解析器”以外的任何选项就试图否决投票:
<resource.+?<propertyValue name=(["'])([^"']*)\1.+?</resource>
Pattern p = Pattern.compile("<resource name=.+?</resource>",
Pattern.MULTILINE | Pattern.DOTALL);
String in = getStringFromFile(path, name, pre, count);
System.out.println("Länge: " + in.length());
Matcher m = p.matcher(in);
StringBuffer sb = new StringBuffer();
int c = 0;
while (m.find()) {
m.appendReplacement(sb, getReplacementStage1(m, c++));
}
m.appendTail(sb);
writeStringToFile(path, name, pre, count, sb.toString());
private static String getReplacementStage1(Matcher m, int c) {
Pattern p1 = Pattern.compile(
"<resource[^>]*?contentType=\"Evaluation\"", Pattern.MULTILINE
| Pattern.DOTALL);
Matcher m1 = p1.matcher(m.group());
if (!m1.find()) {
// remove
return "";
}
Pattern p2 = Pattern.compile("<propertyValue name=\"(?:RCSA|TRA)\"",
Pattern.MULTILINE | Pattern.DOTALL);
Matcher m2 = p2.matcher(m.group());
if (m2.find()) {
// remove
return "";
}
// no change, return the group
return m.group();
}