RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1599346
Accepted
Лена
Лена
Asked:2024-11-10 09:40:58 +0000 UTC2024-11-10 09:40:58 +0000 UTC 2024-11-10 09:40:58 +0000 UTC

从该行中提取一些参数

  • 772
URL.match(/(?<=(auto|news)-|[?&]mdl=)\d+/g)?.map(v => +v)

如果有 Get 参数 mdl,我们会提取连字符后面的数字和数字。我们立即将值转换为数字......

如何使另一个值出现在数组的输出中。字符串,拉出连字符之前的内容。也就是说,无论是汽车还是新闻......

示例字符串

https://example.com/auto-123?mdl=789
https://example.com/news-123
https://example.com/auto-123?asd=22&mdl=789
https://example.com/mmm-123

如果该行既不包含“auto”也不包含“news”。必须返回NULL。数组中的第一个值必须始终是“auto”或“news”,第二个是“123”,第三个可能不是这个 mdl 值

javascript
  • 2 2 个回答
  • 47 Views

2 个回答

  • Voted
  1. Uranus
    2024-11-10T12:15:02Z2024-11-10T12:15:02Z

    为了同时获取连字符之后的数值和其之前的字符串(auto或news),最好使用多个括号组而不是回溯来提取这两个值。

    const URL = "https://example.com/page?auto-123&news-456&mdl=789";
    
    const matches = Array.from(
      URL.matchAll(/(auto|news)-(\d+)|[?&]mdl=(\d+)/g),
      match => ({
        type: match[1] || 'mdl', // либо 'auto', 'news', либо 'mdl'
        value: +(match[2] || match[3]) // числовое значение после дефиса или значение mdl
      })
    );
    
    console.log(matches);

    • 3
  2. Best Answer
    stylok
    2024-11-12T01:45:31Z2024-11-12T01:45:31Z

    考虑到出现的解析行的示例,它立即变得更加容易。我们按顺序走吧。首先,适应一个已经不是最容易理解的常规系统是没有意义的。此外,我们需要更多数据,因此我们将编写自己的数据。并且马上...

    /(((auto|news)-\d+)|(mdl=\d+))/g
    

    如果你仔细观察,一切都非常清楚:“括号组”,“或”和“数字”(来自一个或多个),这要归功于.match()值数组将以数组的形式返回给我们 - ['auto-123', 'mdl=789']。

    我们所要做的就是提取必要的参数及其值。我不知道你最喜欢它们的最终形式,但我假设是一个物体的形式。但是,为了便于理解,我将首先以 results 的形式呈现结果match(),然后为了清晰起见,我们将对其进行遍历.map(),最后您可能需要.reduce()以对象的形式显示结果。

    const arr = [
      'https://example.com/auto-321?mdl=789',
      'https://example.com/news-123',
      'https://example.com/auto-123?asd=22&mdl=789',
    ]
    arr.forEach(url => {
      const data = url.match(/(((auto|news)-\d+)|(mdl=\d+))/g)
      console.log(data)
    });

    我认为结果非常清楚。实际上,我们剩下的就是使用以下方法将它们转换为数组或对象.split()

    .split(/\-|=/) // по регулярке ибо у нас есть выбор между 'минус' и 'равно'
    

    const arr = [
      'https://example.com/auto-321?mdl=789',
      'https://example.com/news-123',
      'https://example.com/auto-123?asd=22&mdl=789',
    ]
    arr.forEach(url => {
      const data = url.match(/(((auto|news)-\d+)|(mdl=\d+))/g).map(i =>  i.split(/\-|=/))
      console.log(data)
    });

    正如您所看到的,我们现在有一个 ['key','value'] 形式的数组,剩下的就是以一种或另一种形式返回结果。有足够的方法,但由于我们已经使用了它.map(),我们将返回一个对象数组。

    const arr = [
      'https://example.com/auto-321?mdl=789',
      'https://example.com/news-123',
      'https://example.com/auto-123?asd=22&mdl=789',
    ]
    arr.forEach(url => {
      const data = url.match(/(((auto|news)-\d+)|(mdl=\d+))/g).map(i => {
        const re = i.split(/\-|=/)
        return {[re[0]]: re[1]} // [re[0]] — небольшое "колдунство" для получения имени ключа
      });
      console.log(data)
    });

    好吧,因为很可能你不需要一个对象数组(尽管当对象太多并且你需要在那里找到一些东西时它也有其优点),而是一个对象,那么.map()我们将使用.reduce()

    const arr = [
      'https://example.com/auto-321?mdl=789',
      'https://example.com/news-123',
      'https://example.com/auto-123?asd=22&mdl=789',
    ]
    arr.forEach(url => {
      const data = url.match(/(((auto|news)-\d+)|(mdl=\d+))/g)  .reduce((acc,i) => {
        const re = i.split(/\-|=/)
        acc[re[0]] = re[1];
        return acc
      }, {});
      console.log(data)
    });

    其实你需要的就是这个

    URL?.match(/(((auto|news)-\d+)|(mdl=\d+))/g).reduce((acc,i) => {
      const re = i.split(/\-|=/)
      acc[re[0]] = re[1];
      return acc
    }, {});
    

    PS,您可能已经注意到,我从数组中删除了一个明显“无效”的字符串...这只是为了不用“约定”乱扔示例,但在您的情况下,一切都已经由?.-提供URL?.match()。

    PPS 用于掌握常规培训和这方面的其他培训,控制台并不总是方便,但有tyts或tyts在线服务可供选择。

    • 1

相关问题

  • 第二个 Instagram 按钮的 CSS 属性

  • 由于模糊,内容不可见

  • 弹出队列。消息显示不正确

  • 是否可以在 for 循环中插入提示?

  • 如何将 JSON 请求中的信息输出到数据表 Vuetify vue.js?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5