2012-02-20 3 views
0

Я ищу регулярное выражение, но не могу найти.Регулярное выражение слишком голодное

Синтаксический текстовый файл, глядя, как этот

<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> 

Он соответствует первому тегу ресурса и второй + третьей. Может кто-нибудь изменить регулярное выражение, которое он действительно останавливается на первом </resource>

Я использую этот код Java

Pattern.compile("<resource.+?<propertyValue name=\"RCSA\".+?</resource>",Pattern.MULTILINE | Pattern.DOTALL) 
+13

использовать парсер. – YXD

+0

Простой вопрос: почему вы не используете инструменты XML для этого? regexp не подходит для XML или HTML – SergeS

+0

Почему бы не использовать Jsoup? Было бы тривиально найти первый элемент 'resource'. – bdares

ответ

0

я решил его с этим выражением: <resource(?:(?!<propertyValue).)+<propertyValue name="RCSA"(?:(?!<resource).)+</resource> но это замедляться. Итак, я немного посмотрел, что еще можно сделать на Java, и нашел легкое и быстрое решение.

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

Так первый я использую проще и быстрее RegEx, а затем вместо того, чтобы использовать String.replaceAll я использую сличитель, чтобы иметь возможность рассчитать замену для каждого найти.

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

Так может быть это решение помогает кто-то с подобной проблемой, что не любит/нужен XML парсер ...

0

Как г-н Е указывает, что это не лучший способ для чтения данных из файла XML в все. Не говоря уже о том, если вам вдруг придется иметь дело с вложенными элементами! Однако это будет соответствовать атрибуту name propertyValue внутри ресурса.

<resource.+?<propertyValue name=(["'])([^"']*)\1.+?</resource> 
+0

Мне не нужен контент атрибута name. Я хочу заменить весь элемент ресурса, если атрибут name значения свойства RCSA. – Nabor

+1

А я вижу, в любом случае, рассмотреть использование синтаксического анализатора XML и пройти через детей. Даже если вы заработаете таким образом, это не долгосрочное решение и в конечном итоге обречено на неудачу в некоторых файлах XML. –

+0

Файл XML имеет размер 200 МБ. В нем много разных тегов, о которых я не упоминал здесь. Так что попробуйте использовать 5 различных регулярных выражений, чтобы уменьшить файл или изменить какой-либо контент. Написание XML-парама займет у меня часы ... – Nabor

Смежные вопросы