Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式太饿了_Java_Regex - Fatal编程技术网

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();
}