从字符串 JavaScript 中过滤多个正则表达式

Filter multiple regex from a string javascript

本文关键字:正则表达式 过滤 字符串 JavaScript      更新时间:2023-09-26

我想使用 javascript 从字符串中获取多个变量。

字符串示例:

<span var1="abc" some random thing var2="cde" another random stuff var3="efg"></span>
<span var1="abc" some random thing var2="cde" another random stuff??>
<::" var3="efg"></span>

我想得到var1var2var3

我只能对第一组使用此正则表达式获得的最接近的正则表达式。

span var1="(.*?)"(?:.*)var2="(.*?)"(?:.*)var3="(.*?)"(?:.*)'/span

下面是示例:例

谢谢!

编辑 请参阅正则表达式 101 演示。你可以试试:

function getVars(str) {
  var reg = /var1="(.*?)".*?'n*.*?var2="(.*?)".*?'n*.*?var3="(.*?)"/g;
  while (found = reg.exec(str)) {
    document.write ("var1 = " + found[1] + "<br>var2 = " + found[2] + "<br>var3 = " + found[3] + "<br>" );
  }
}
var str = '<span var1="abc" some random thing var2="cde" another random stuff var3="efg"></span>'n' + 
'<span var1="abc" some random thing var2="cde" another random stuff??>'n' +
'<::" var3="efg"></span>';
getVars(str);

我错过了什么吗?你的代码对我有用。

请参阅以下示例:

var str = '<span var1="abc" some random thing var2="cde" another random stuf var3="efg"></span><span var1="abc" some random thing var2="cde" another random stuf??><::" var3="efg"></span>';
var re = /<span var1=["'](.*?)["'](?:.*)var2=["'](.*?)["'](?:.*)var3=["'](.*?)["'](?:.*)'/span>/;
var matches = re.exec(str).slice(1);
matches.forEach(function(match) {
  document.body.insertAdjacentHTML('beforeend', match + '<br>');
});

你需要的是正则表达式的exec方法。它允许您重复获得子比赛,在最后一场比赛后继续在位置。

我做了什么:

  • 我用regex.exec而不是string.match
  • 我添加了g以使正则表达式全局化
  • 我把(?:.*)改成了.*?,因为它太贪婪了,吃掉中间的所有内容

现在它可以工作了(jQuery仅用于输出的简单可视化):

var str = '<span var1="abc" some random thing var2="cde" another random stuf var3="efg"></span><span var1="abc" some random thing var2="cde" another random stuf??><::" var3="efg"></span>';
// Note that I added "g" to make it a global selector and changed all (?:.*) to .*?
var re = /<span var1="(.*?)".*?var2="(.*?)".*?var3="(.*?)".*?'/span>/g;
var matches;
// You can call re.exec repeatedly and it will return always the next group of results
while(matches = re.exec(str)) {
    // matches will look like this: ["<span var1="abc" some random thing var2="cde" another random stuf var3="efg"></span>", "abc", "cde", "efg", index: 0, input: "<span var1="abc" some random thing var2="cde" anot…de" another random stuf??><::" var3="efg"></span>"]
    // This is just for nice output
    $("<span/>").text(matches[0]).appendTo("body");
    $("<ul/>").append(matches.slice(1).map(function(m) {
        return $("<li/>").text(m);
    })).appendTo("body");
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

如果你想不那么"僵硬",只寻找任何看起来像带引号的HTML属性的东西,你可以改用这个正则表达式:/'s(['w-]+)="(.*?)"/g