2016-04-21 2 views
0

В html doc мне нужно заменить полный путь к файлам только с именами файлов. Документы очень большие, поэтому я думаю, что я могу использовать регулярное выражение для получения практического решения. Я уже читал подобные вопросы и пробовал решения, но это просто не работало.Java regex pattern соответствует только последнему вхождению строки

Пример. Учитывая этот html-ввод.

<img src="app/javax.faces.resource/color_pan.png?ln=img/partidos" style="width:100%; height:30px;" class="centerImg"/> 
<img src="/app/javax.faces.resource/pan.png?ln=img/partidos" class="centerImg"/> 

мне нужно на следующие выходные:

<img src="color_pan.png" style="width:100%; height:30px"; class="centerImg"/> 
<img src="pan.png" class="centerImg"/> 

Я пытаюсь эти модели:

Pattern p = Pattern.compile("src=\"(?=.*src).*/color_pan.png[^\"]*\""); 
Patter p1 = Pattern.compile("src=\"(?!.*src).*/pan.png[^\"]*\""); 

Первый работает отлично для 1-го изображения, а второй является решением для второго (оба находятся на одном html-документе). Мне нужен общий шаблон, который работает для каждого изображения. Поэтому проблема заключается в том, чтобы найти только первый элемент «src», который появляется слева от имени файла. Другими словами, «src» должен быть последним, который появляется перед именем файла. Таким образом, я мог бы правильно заменить строки. Любая помощь приветствуется.

+0

Я бы первым обрезать все после '?' Из вашей строки .. а затем получить все, что нужно до последнего '/' из оставшейся строки (другими словами, я бы не использовал регулярное выражение в этом случае :)) – ochi

ответ

0

Это регулярное выражение, кажется, чтобы сделать работу

Решение 1 < = 2 матча в 1509 году шаги

(^<img src=")(?:.*?)([\w.]+)(?=\?)[^"]*"(.*$) 

Regex Demo

На пути к эффективному решению

Решение 2 < = 2 матча в 593 шагах

(^<img src=").*(?<=\/|")([\w.]+)(?=\?)[^"]*"(.*$) 

кода Java

String pattern = "(^<img src=\")(?:.*?)([\\w.]+)(?=\\?)[^\"]*\"(.*$)"; 
Pattern r = Pattern.compile(pattern); 

while (true) { 
    String line = x.nextLine(); 
    Matcher m = r.matcher(line); 
    if (m.find()) { 
     System.out.println(m.group(1) + m.group(2) + m.group(3)); 
    } else { 
     System.out.println("Not Found"); 
    } 
} 

Ideone Demo

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