Как извлечь все совпадения из группы - PullRequest
1 голос
/ 02 июля 2019

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

Я пытаюсь захватить каждое "значение", связанное только с attribute_2, из html.Это мой подход: https://regex101.com/r/z5T20g/2

<select id="product_attribute_1">
  <option value="1">2.2 GHz</option>
  <option value="2">2.5 GHz</option>
</select>
<select id="product_attribute_2">
  <option value="3">2GB</option>
  <option value="4">4GB</option>
  <option value="5">8GB</option>
</select>

product_attribute_2[\s\S]*"(\d+)"[\s\S]*select> ---this show last match (5)
product_attribute_2[\s\S]*?"(\d+)"[\s\S]*select> --this first (3)

Как мне извлечь все значения (3,4,5)?Там может быть разное количество значений.Помогите пожалуйста)

PS Я не пытаюсь разобрать html с регулярным выражением.Эти значения используются в скрипте Гатлинга.Я использовал этот пример для сбора уникальных атрибутов.Думаю, в моем случае я могу использовать что-то вроде этого.

\b(product_attribute_\d)(?![\s\S]*?\b\1)

Я использую регулярное выражение для извлечения значений из тела ответа в инструменте Gatling (Scala).Это сохранит все значения в список.enter image description here

Сделать это через css-селектор

select[id='product_attribute_2'] [value]

Ответы [ 2 ]

2 голосов
/ 02 июля 2019

Если нам нужно применить регулярное выражение для этой проблемы, мы, вероятно, можем начать с этого простого выражения:

.*product_attribute_2.*?|option value="(\d+)"|<\/select>.* 

в s режиме:

Демонстрация в режиме S

или с этим выражением:

[\s\S]*product_attribute_2|option value="(\d+)"|<\/select>[\s\S]*

в m режиме:

Демонстрация в режиме M

const regex = /.*product_attribute_2.*?|option value="(\d+)"|<\/select>.*/gs;
const str = `<select id="product_attribute_1">
  <option value="1">2.2 GHz</option>
  <option selected="selected" value="2">2.5 GHz</option>
</select>
<select id="product_attribute_2">
  <option value="3">2GB</option>
  <option value="4">4GB</option>
  <option value="5">8GB</option>
</select>`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}
1 голос
/ 02 июля 2019

Вы можете извлечь значения, используя ванильный JavaScript, следующим образом:

const options = Array.from(document.querySelector('#product_attribute_2').children);
const values = options.map(x => Number(x.getAttribute('value')));
console.log(values);
<select id="product_attribute_1">
  <option value="1">2.2 GHz</option>
  <option value="2">2.5 GHz</option>
</select>
<select id="product_attribute_2">
  <option value="3">2GB</option>
  <option value="4">4GB</option>
  <option value="5">8GB</option>
</select>
...