Что нового

RegExp Найти название раздела по его содержимому

randal

Новичок
Сообщения
21
Репутация
4
Есть HTML таблица, содержащая множество разделов с заголовками. Нужно найти название раздела, внутри которого есть определённая строка.
Таблица примерно такая:
HTML:
<th> раздел1 </th>
<th> раздел2 </th>
    <a> qwer </a>
<th> раздел3 </th>
    <a> aaaa </a>
    <a> bbb </a>
    <a> cdcdcdcd </a>
При искомой фразе "<a>bbb</a>" результатом должно быть - "раздел3"
Я пробовал так:
Код:
(?s)<th>(.*?)</th>.*?<a>bbb</a>

но она почему-то выдаёт самый первый раздел (раздел1), а не ближайший к искомому слову :unknown: Что я делаю не так?
 

gunter123

Продвинутый
Сообщения
138
Репутация
55
Код:
$s = '<th> раздел1 </th>' & @CRLF & _
      '<th> раздел2 </th>' & @CRLF & _
      '   <a> qwer </a>' & @CRLF & _
      '<th> раздел3 </th>' & @CRLF & _
      '   <a> aaaa </a>' & @CRLF & _
      '    <a> bbb </a>' & @CRLF & _
      '    <a> cdcdcdcd </a>' & @CRLF

MsgBox(4096, '', StringRegExp($s, '(?s).*<th>(.+?)</th>.*?<a> bbb </a>', 3)[0])
 
Последнее редактирование:
Автор
R

randal

Новичок
Сообщения
21
Репутация
4
Ваш вариант не учитывает случаи, когда искомая строка bbb может встречаться несколько раз в разных разделах. И мне нужны все совпадения.
Например, в таком случае найдёт только последний раздел:
Код:
#include <Array.au3>
$s = '<th> раздел1 </th>' & @CRLF & _
      '<th> раздел2 </th>' & @CRLF & _
      '   <a> qwer </a>' & @CRLF & _
      '<th> раздел3 </th>' & @CRLF & _
      '   <a> aaaa </a>' & @CRLF & _
      '    <a> bbb </a>' & @CRLF & _
      '    <a> cdcdcdcd </a>' & @CRLF & _
      '<th> раздел4 </th>' & @CRLF & _
      '   <a> bbb </a>' & @CRLF & _
      '    <a> cccc </a>' & @CRLF & _
      '    <a> zxczxc </a>' & @CRLF
$tmp = StringRegExp($s, '(?s).*<th>(.+?)</th>.*?<a> bbb </a>', 3)

_ArrayDisplay($tmp)
 

xXx

Меценат
Меценат
Сообщения
105
Репутация
33
Код:
#include <Array.au3>
$sGS = Chr(29)
$s = '<th> раздел1 </th>' & @CRLF & _
        '<th> раздел2 </th>' & @CRLF & _
        '   <a> qwer </a>' & @CRLF & _
        '<th> раздел3 </th>' & @CRLF & _
        '   <a> aaaa </a>' & @CRLF & _
        '    <a> bbb </a>' & @CRLF & _
        '    <a> cdcdcdcd </a>' & @CRLF & _
        '<th> раздел4 </th>' & @CRLF & _
        '   <a> bbb </a>' & @CRLF & _
        '    <a> cccc </a>' & @CRLF & _
        '    <a> zxczxc </a>' & @CRLF
$s = StringRegExpReplace($s, '<th>', $sGS)
$tmp = StringRegExp($s, '(?i)' & $sGS & '([^<]+)</th>(?s)[^' & $sGS & ']*?<a> bbb </a>', 3)
_ArrayDisplay($tmp)
 
Автор
R

randal

Новичок
Сообщения
21
Репутация
4
интересное решение, однако :smile: Вместо Chr(29) можно взять и стандартный символ из неиспользуемых в HTML, например ` или тильду, чтобы упростить код.
Вообще, я надеялся, что кто-нибудь предложит вариант с групповыми флагами (ну которые (?!...)), потому что сам так и не разобрался в их синтаксисе, но такой вариант тоже сойдёт. Спасибо :good:
 

zghwelcome

Новичок
Сообщения
2
Репутация
1
try this:
(?is)>\h*(\V*)\h*</th>(?:(?!<th>).)*<a>\h*bbb\h*</a>
 
  • Like
Реакции: xXx
Верх