我正在使用正则表达式函数,但它不起作用?

i am using regex function but it didn't work?

提问人:Dasy 提问时间:10/12/2021 最后编辑:JesperDasy 更新时间:10/12/2021 访问量:94

问:

当我使用正则表达式函数作为标题和标题时,它可以工作 但是当我添加更多匹配标签时,它就不起作用了

这是下面的代码,可以正常工作,没有任何问题

  $(".sidebar").each(function() {
        var e = $(this),
            t = e.find(".widget").text();
        if (t) {
            var a = t.match(/title=\(([^)]*)\)\s+caption=\(([^)]*)\)/);
           alert(t);
        }
 });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='sidebar'>
<div class='widget'>title=(example1) caption=(example2)</div>
</div>

但问题是当我尝试使用多个匹配标签时,它不起作用 喜欢

<div class='widget'>title=(example1) caption=(example2) button=(example3) price=(example4) off=(example5)</div>

我努力使用与上面相同的正则表达式来表示这个值,但它不起作用

我还想添加这些示例文本,输出看起来像是 example1、example2、example3、example4、example5,但我不知道使用正则表达式函数完成

任何帮助或建议将不胜感激

JavaScript jQuery 正则表达式 匹配

评论

0赞 testing_22 10/12/2021
带有 g(全局)标志的正则表达式可再次捕获一次/.../g
0赞 Jesper 10/12/2021
所以你想匹配字符串中的示例n吗?
0赞 Philippe 10/12/2021
你好!你的新先决条件是什么?旧的还是匹配存在的,依此类推?buttonprice

答:

0赞 Terry 10/12/2021 #1

不要使用 ,请考虑使用 ,这样也可以访问捕获组。理想情况下,捕获组应捕获字符后面的括号内的值,因此您可以将正则表达式模式编写为:match()exec()=

 var re = /\w+?=\((.*?)\)/gi;

然后,只需运行一个循环以递归方式调用该方法,直到找不到更多匹配项:whileexec()

$(".sidebar").each(function() {
  var e = $(this);
  var t = e.find(".widget").text();

  if (t) {
    var result;
    var results = [];
    var re = /\w+?=\((.*?)\)/gi;
    while ((result = re.exec(t)) !== null) {
      console.log(result[1]);
      results.push(result[1]);
    }
    
    console.log('Logging all captured values:\n', results);
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='sidebar'>
  <div class='widget'>title=(example1) caption=(example2) button=(example3) price=(example4) off=(example5)</div>
</div>

更好的是:你甚至不需要jQuery:

document.querySelectorAll('.sidebar .widget').forEach(el => {
  const t = el.innerText.trim();
  
  if (t) {
    let result;
    const results = [];
    const re = /\w+?=\((.*?)\)/gi;
    while ((result = re.exec(t)) !== null) {
      console.log(result[1]);
      results.push(result[1]);
    }
    
    console.log('Logging all captured values:\n', results);
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='sidebar'>
  <div class='widget'>title=(example1) caption=(example2) button=(example3) price=(example4) off=(example5)</div>
</div>

0赞 Roko C. Buljan 10/12/2021 #2

下面是一个示例,说明如何在给定此格式的情况下获取任何值:

匹配任何不是 的任何内容一次或多次
必须前面
,并且必须后面
\w+=()

在此 Regex101 示例中更好地解释

$(".sidebar").find(".widget").each(function() {

  const txt = $.trim($(this).text()); // Get trimmed text
  if (!txt) return; // Do nothing
  
  const matches = txt.match(/(?<=\b\w+=\()[^)]+(?=\))/g)||[];
  
  matches.forEach(m => {
    console.log(m);
  });
  
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='sidebar'>
  <div class='widget'>title=(example1) caption=(example2) button=(example3) price=(example4) off=(example5)</div>
  <div class="widget">ola</div>
  <div class="widget"></div>
  <div class="widget">The magic happens=(here) :)</div>
</div>

0赞 The fourth bird 10/12/2021 #3

在代码中,使用 which is the result fromalert(t);t = e.find(".widget").text();

如果使用结果,则正则表达式将返回 的匹配项,其中 和 在捕获组中具有值,但匹配项应按该顺序进行。var a = t.match(/title=\(([^)]*)\)\s+caption=\(([^)]*)\)/);title=caption=

您将得到一个匹配项,因为没有标志,并且在示例数据中也只有 1 次出现。/g

你可以做的是让你的表达式不那么严格一些,而不是专门匹配标题和捕获,而是匹配 1 个或多个非空格字符,而不是等号。

使用标志获取所有匹配项,而不是单个匹配项。/g

[^\s=]+=\(([^)]*)\)
  • [^\s=]+匹配 1+ 乘以除空格字符或空格字符以外的任何字符=
  • =从字面上匹配
  • \(火柴(
  • ([^)]*)在第 1 组中捕获除 or use 以外的可选字符,而不是 for 1 或多个)+*
  • \)火柴)

用于查看捕获的组值的正则表达式演示

$(".sidebar").each(function() {
  var e = $(this),
    t = e.find(".widget").text();
  if (t) {
    var a = t.matchAll(/[^\s=]+=\(([^)]*)\)/g);
    console.log(Array.from(a, m => m[1]));
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='sidebar'>
  <div class='widget'>title=(example1) caption=(example2) button=(example3) price=(example4) off=(example5)</div>
</div>