Как с помощью регулярных выражений извлечь все значения?

Как с помощью регулярного выражения извлечь все значения атрибута option value (1, 2, 3) для конкретного элемента select с заданным id (например, id='name')? Я понимаю, как получить все значения option value в целом, но не могу понять, как это сделать для конкретного select id. Я пробовал использовать <a href="https://regex101.com/r/YfmsBt/1" rel="nofollow">такую регулярку</a>, но моя конфигурация запоминает только последнее значение (3) в скобочной группе.
  • 4 октября 2024 г. 7:04
Ответы на вопрос 2
Чтобы извлечь все значения атрибута `value` внутри элементов `<option>` для конкретного элемента `<select>` с заданным `id`, вы можете использовать следующее регулярное выражение:

```regex
<select[^>]*id=['"]name['"][^>]*>(.*?)</select>
```

Здесь мы находим сам элемент `<select>` с заданным `id`. После этого мы используем `.*?` для получения содержимого между открывающим и закрывающим тегами `<select>`. Данное выражение будет захватывать все содержимое внутри `<select>`, включая элементы `<option>`.

Затем, чтобы извлечь все `value` атрибуты из найденных `<option>`, используем еще одно регулярное выражение:

```regex
<option[^>]*value=['"]([^'"]+)['"][^>]*>
```

Это выражение позволит вам извлечь все значения `value` в элементах `<option>`. Теперь, чтобы собрать оба эти шага в одно, вы можете сделать следующее:

1. С помощью первого регулярного выражения извлечь HTML-код для `<select id='name'>`.
2. Затем применить второе регулярное выражение на полученном содержимом.

Вот пример кода на Python, который выполняет обе задачи:

```python
import re

html_content = """
<select id='name'>
    <option value='1'>Option 1</option>
    <option value='2'>Option 2</option>
    <option value='3'>Option 3</option>
</select>
"""

# 1. Извлекаем содержимое select с нужным id
select_pattern = r"<select[^>]*id=['\"]name['\"][^>]*>(.*?)</select>"
match = re.search(select_pattern, html_content, re.DOTALL)

if match:
    select_content = match.group(1)
    
    # 2. Извлекаем все значения value из option
    option_pattern = r"<option[^>]*value=['\"]([^'\"]+)['\"][^>]*>"
    values = re.findall(option_pattern, select_content)
    print(values)  # Вывод: ['1', '2', '3']
```

В этом примере:
- Мы ищем `<select>` с `id='name'`.
- Затем находим все значения `value` внутри найденных элементов `<option>`, что дает нам список `['1', '2', '3']`. 

Таким образом, вы получите все значения `value` для конкретного элемента `select`.
Не знаю устроит или нет, но можно так 
#!/bin/bash
echo "select id='name1' method='out1'
option value='10'

option value='20'

option value='30'

select id='name2' method='out2'

option value='11'

option value='22'

option value='33'

select id='name3' method='out3'

option value='100'

option value='200'

option value='300'" | sed -rn "/select id='name2'/,/select/ s/option value='(.+)'/\1/p"
Похожие вопросы