【问题标题】:i am using regex function but it didn't work?我正在使用正则表达式函数,但它不起作用?
【发布时间】:2021-12-01 01:43:33
【问题描述】:

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

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

  $(".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 但我不知道使用正则表达式函数

非常感谢任何帮助或建议

【问题讨论】:

  • 正则表达式 /.../g 带有 g(全局)标志以再捕获一次
  • 那么你想在你的字符串中匹配示例 n 吗?
  • 嗨!你的新先决条件是什么?旧的还是匹配buttonprice等的存在?

标签: javascript jquery regex match


【解决方案1】:

在您的代码中,您使用alert(t);,这是t = e.find(".widget").text(); 的结果

如果您使用来自 var a = t.match(/title=\(([^)]*)\)\s+caption=\(([^)]*)\)/); 的结果,那么正则表达式将返回 title=caption= 的匹配项,它们在捕获组中都有一个值,但匹配项应按该顺序排列。

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

您可以做的是让您的表达式限制更少,而不是专门匹配标题和捕获,而是匹配 1 个或多个非空白字符而不是等号。

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

[^\s=]+=\(([^)]*)\)
  • [^\s=]+ 匹配除= 或空白字符以外的任何字符的 1 次以上
  • = 字面匹配
  • \(匹配(
  • ([^)]*)组 1 中捕获除) 以外的可选字符,或使用+ 代替* 以获取1 个或多个
  • \)匹配)

regex demo 查看捕获的组值:

$(".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>

【讨论】:

  • 谢谢老兄的回答
  • @riya875 不客气。请考虑通过单击左侧的 ✓ 来接受任何对您有用的给定答案(请参阅How to accept SO answers)。请注意,您会得到 2 reputation points 接受解决方案。从 15 个声望点中,您可以upvote) 给出您认为有用的答案。
【解决方案2】:

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

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

This Regex101 Example中有更好的解释

$(".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>

【讨论】:

  • 谢谢老兄的回答
【解决方案3】:

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

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

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

$(".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>

【讨论】:

  • 谢谢老兄的回答
猜你喜欢
  • 1970-01-01
  • 2023-01-22
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多