2014-10-22 3 views
0

Есть ли возможное решение этой проблемы?Теги Regex Игнорировать все теги td внутри тега tr

Я хочу регулярное выражение, которое игнорирует все теги td в тегах tr. Теги tr, которые я ищу, неверны, поскольку в конце тега отсутствует "/". До сих пор у меня есть:

<tr[^>]*><td(?:(?!</td>).)*</td><tr[^>]*> 

<tr[^>]*> This needs to be the beginning of the expression **** 

<td(?:(?!</td>).)*</td> This will find everything between <td> and </td> 

<tr[^>]*> This needs to be the end of the expression **** 

Это регулярное выражение не работает, конечно. Вот пример текста, чтобы запустить регулярное выражение:

Образец 1:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>     
    </title> 
</head>        
<body> 
    <table asdf> 
     <tr asdf> 
     <td asdf> 
      <table asdf> 
       <tr asdf: asdf> 
        <td> 
         blah blah blah 
        </td> 
       </tr> 
      </table> 
      </td> 
      <td> 
       Keep going 
      </td> 
     <tr> If highlighted to here from first tr tag than correct regex was used 
    </table> 
</body> 
</html> 

Образец 2:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>     
    </title> 
</head>        
<body> 
    <table asdf> 
     <tr asdf> 
     <td asdf> 
      <table asdf> 
       <tr asdf: asdf> 
        <td> 
         blah blah blah 
        </td> 
       </tr> 
      </table> 
      </td> 
      <td> 
       <table asdf> 
       <tr asdf: asdf> 
        <td> 
         blah blah blah 
        </td> 
       </tr> 
      </table> 
      </td> 
     <tr> If highlighted to here from first tr tag than correct regex was used 
    </table> 
</body> 
</html> 

Пример 3:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>     
    </title> 
</head>        
<body> 
    <table asdf> 
     <tr asdf> 
     <td asdf> 
      <table asdf> 
       <tr asdf: asdf> 
        <td> 
         blah blah blah 
        </td> 
       </tr> 
      </table> 
      </td> 
      <td> 
       <table> 
       <tr> 
        <td> 
         blah blah blah 
        </td> 
       </tr> 
      </table> 
      </td> 
     <tr> If highlighted to here from first tr tag than correct regex was used 
    </table> 
</body> 
</html> 

Пример 4:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>     
    </title> 
</head>        
<body> 

<table> 
    <tr> 
     <td>&nbsp;</td> 
    </tr> 
</table> 
<br/> 
<br/> 
<br/> 
<table class="afdadsf"> 
    <td></td> 
</table> 
<br/> 
<br/> 
<table class="fdafdas"> 
    <tr><td></td> 
      </tr> 
    </table> 
</body> 
</html> 

Мой желаемый результат - это когда выполняется регулярное выражение, первый тэг до последнего тэга тега подсвечивается с использованием обоих примеров текста выше. Предположим, что другие образцы текстов, где тег td может содержать любое значение.

+0

Вы хотите игнорировать все '' тегов '' , но не отсутствие '' проблем? Вероятно, вы должны указать желаемый результат. –

+0

Не думаю, что недостаток является проблемой. Мне нужно иметь ] *> в конце и начале выражения регулярного выражения, так как я ищу теги, которые некорректно заканчиваются . Мой желаемый результат объясняется в разделе кода образца текста. Я отредактирую свой комментарий и переведу его за пределы раздела кода. – developer234

ответ

0

основан на том, что был опубликован и просил, если ваш Regex двигатель поддерживает рекурсию (?R) использовать этот шаблон:

<tr[^>]*>.*(<(\S+)[^>]*>([^<]|(?1))*?<\/\2>).*?<tr[^>]*> 

может потребоваться обширное исследование
Demo


на основе комментариев ниже <tr> теги всегда самые внешние, используйте этот шаблон s опция включена:

(<tr[^>]*>.*<tr>) 

Demo

+0

Что вы имеете в виду, пропустив, обновите свой вопрос и опубликуете ожидаемый результат. в этом обновленном примере совпадение # 1 - это то, что вы просили выделить http://regex101.com/r/yW4aZ3/95 –

+0

Я отредактировал свой вопрос, и вот мои проблемы с вашим ответом: 1. Я использовал это регулярное выражение в все мои файлы, и если выражение не существует, оно выделяет все в файле. У меня есть тысячи файлов. 2. Ваше регулярное выражение работает только для одного образца текста. – developer234

+0

Вопрос, есть ли шанс, что после последнего «неправильного» '' у вас будет больше ' ..' tags? Другими словами, неправильный тег всегда самый внешний? –

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