如何提取组中的所有匹配项

时间:2019-07-02 13:05:09

标签: regex regex-group

希望有人可以帮助我解决我的问题。我正在尝试使用相同的模式在所有值字段的文本范围内捕获相同的组。

我尝试从html中捕获仅与attribute_2相关的每个“值”。 这是我的方法:     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)?可能会有不同数量的值。请帮助)

P.S。我不是试图用正则表达式解析html。该值在Gatling脚本中使用。 我使用此示例来收集唯一属性。想一想我可以使用这样的东西。

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

我使用正则表达式在Gatling工具(Scala)中从响应主体中提取值。 这会将所有值保存到列表。  enter image description here

通过css-选择器

select[id='product_attribute_2'] [value]

2 个答案:

答案 0 :(得分:2)

如果我们必须对此问题应用正则表达式,则可以从以下简单表达式开始:

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

s模式下:

Demo on S Mode

或具有以下表达式:

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

m模式下:

Demo on M Mode

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 :(得分:1)

您可以使用香草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>