如何为不同的可选值添加正则表达式?[已结束]

How to add regex for different optional values? [closed]

提问人:Dasy 提问时间:12/23/2021 最后编辑:Dasy 更新时间:12/24/2021 访问量:106

问:


想改进这个问题吗?通过编辑这篇文章来更新问题,使其仅关注一个问题。

1年前关闭。

我正在做一个使用正则表达式函数的项目。

这是我在 jsFiddle 中的代码

我自己的 JsFiddle 代码

HTML 就在这里

<div class="post-body">
  <a href='/'>color=(green) title=(Hello World) caption=(Hello City 2) post=(New)</a>
</div>

JS就在这里

    $(".post-body").each(function() {
        var e = $(this),
            t = e.find("a").text();
        if (t) {
            var a = t.match(/title=\(([^)]*)\)\s+caption=\(([^)]*)\)/);
            if (a) {
                var s = a[1];
                  
                0 != s && e.find("a").text(s), 0 != i && e.find("a").text(i)
            }
        }
 });

此代码工作正常,但是当我输入颜色帖子值时,代码停止工作。

我不知道为什么所有的值都没有显示为?My World Hello City 2 New

在下面,当我尝试放置值时,代码不起作用,我还希望应该有可选的,以便我们可以使用一个值或所有值,例如在这种情况下只使用两个值 titlecaption,或者我们可以使用所有值,例如color=(green) title=(Hello World) caption=(Hello City 2) post=(New)

    $(".post-body").each(function() {
         var e = $(this),
                t = e.find("a").text();
            if (t) {
            var a = t.match(/title=\(([^)]*)\)\s+caption=\(([^)]*)\)\s+post=\(([^)]*)\)\s+color=\(([^)]*)\)\s+content=\(([^)]*)\)\s+size=\(([^)]*)\)/);
            if (a) {
                var s = a[1],
                    i = a[2];
                    m = a[3];
                    n = a[4];
                    z = a[5];
                    y = a[6];
                0 != s && e.find("a").text(s), 0 != i && e.find("a").text(i), 0 != m && e.find("a").text(m), 0 != n && e.find("a").text(n), 0 != z && e.find("a").text(z), 0 != y && e.find("a").text(y)
            }
        }
 });

在研究中,我发现有人创建的代码运行良好,也许有助于解决我的问题

工作 JsFiddle 代码

但是我正在尝试创建自己的正版代码,但它不起作用。我希望在这里我能得到一些解决方案。任何形式的帮助都非常感谢!

JavaScript jQuery 正则表达式 函数 匹配

评论

1赞 Steve Tomlin 12/23/2021
简化您的问题。删除 jquery,仅使用 javascript 函数和正则表达式,对您的输入和预期输出提供完全普通的简单解释。
1赞 freedomn-m 12/23/2021
我不会使用您的“专家开发人员”代码作为示例 - 它显然已被混淆/最小化。没有“专家”会写这样的代码。
0赞 Dasy 12/23/2021
请重新检查 jsFiddle 文件是否已更新,并带有原始代码。
2赞 freedomn-m 12/23/2021
.text(txt)每次都会覆盖文本,您需要: jsfiddle.net/f5zcv8x3/1.append()
1赞 freedomn-m 12/23/2021
TBH 我有点困惑 - 你有“版权”代码,但你希望我们提供的代码完全相同。你的问题中没有提到,只有“做同样的事情......(后来)...它有一个跨度”。我建议你提供一个问题,准确地给出你想要什么和你坚持什么(为什么你不能自己做)。要求我们重写现有代码,使其相同但不同,这是没有意义的。span

答:

2赞 Jose Lora 12/23/2021 #1

您可以使用此正则表达式将所有现有字段匹配到您的语法中,如下所示,并使用 matchAll 将它们全部放入一个数组中,并像这样循环数组,如果您想在某处显示结果:/(?:([a-zA-Z]{3,})+=\(([^)]*)\))/g

$(".post-body").each(function() {
        var e = $(this),
            t = e.find("a").text();
        if (t) {
            var a = [...t.matchAll(/(?:([a-zA-Z]{3,})+=\(([^)]*)\))/g)];
            if (a) {
                a.map(function(item, key){
                  console.log(item)
                  let k = item[1];
                  let v = item[2];
                  
                  $("#results").append(`<span>${v}</span>`);
                });
            }
        }
 });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="post-body">
<a href='/'>color=(green) title=(Hello World) caption=(Hello City 2) post=(New) title=(Hello World 3)</a>
</div>
<br />
<div id="results">

</div>

1赞 Carsten Massmann 12/24/2021 #2

哇 - 这是一个艰难的过程!当@freedomn试图猜测你的意图是什么以及他花了很多时间写答案并向你解释的方式时,我发了白。如果你提供一个清晰的、最小的、可重复的例子,这整个痛苦的事情本来是可以避免的。像 jsfiddle 上的外部片段在这里几乎没有帮助。它们也无法在较小的屏幕上合理工作(例如在智能手机上),许多 SO 用户喜欢在这些设备上回答问题。

点赞和“+1”@JoseLora猜到你想要什么!

最后,整个脚本基本上可以缩短为一行(为了更好的可读性,我在这里将其分成四行):

document.getElementById("result").textContent=
  [...document.querySelector(".post-body a")
  .textContent.matchAll(/([a-zA-Z]{2,})\s*=\s*\(([^)]*)\)/g)]
  .map(e=>e[2]).join(" - ");
<div class="post-body">
  <a href='/'>color=(green) title=(Hello World) caption=(Hello City 2) post=(New)</a>
</div>

<div id="result"></div>

我还稍微更改了正则表达式(删除了一个多余的非捕获组,并在之前和之后添加,以使其在应该忽略任何空格的情况下更加宽容。\s*=