【问题标题】:Regex split string into multiple parts正则表达式将字符串拆分为多个部分
【发布时间】:2017-02-27 21:21:48
【问题描述】:

我有以下字符串

133. Alarm (Peep peep)

我的目标是使用正则表达式将字符串拆分为 3 部分并将其存储为 json 对象,例如

{
   "id": "133",
   "Title": "Alarm",
   "Subtitle": "Peep peep"
}

我可以得到号码使用

function getID(text){
  let numberPattern = /\d+/g;
  let id = title.match(numberPattern);
  if(id){
    return id[0];
  }
}

大括号之间的文本使用

function getSubtitle(text){
  let braces = /\((.*)\)/i;
  let subtitle = title.match(braces);
  if(subtitle){
    return subtitle[1];
  }
}

我想知道是否可以使用单个正则表达式从字符串中获取三个值(假设我会将其应用于该字符串形状的长列表)

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    你可以这样做:

    const data = '133. Alarm (Peep peep)'
    
    const getInfo = data => {
      let [,id, title, subtitle] = data.match(/(\d+)\.\s*(.*?)\s*\((.*?)\)/)
      return { id, title, subtitle }
    }
    
    console.log(getInfo(data))

    【讨论】:

      【解决方案2】:

      类似

      let partsPattern = /(\d+)\.\s*(.*[^[:space:]])\s*\((.*)\)/
      

      不确定 JS 是否可以转换为 POSIX 字符集,您可能希望使用 \s 而不是 [:space:](如果您知道不需要任何其他空格,甚至可以使用空格本身 )。

      这应该捕获各个子匹配中的所有三个部分(数字 1、2 和 3)。

      【讨论】:

      • 是的,用\s 替换[:space:] 有效,你太棒了
      【解决方案3】:

      您可以使用一种功能。如果没有找到匹配项,exec() 将返回 null,否则将返回匹配的字符串,然后是匹配的组。使用id && id[1] 执行检查以在未找到匹配项和id === null 时不访问id 的第二个元素。

      第二个元素使用id[1] 而不是id[0],因为第一个元素将是匹配的字符串,其中包含有助于找到匹配项的点和空格。

      var str = "133. Alarm (Peep peep)";
      
      function getData(str) {
        var id = (/(\d+)\./).exec(str);
        var title = (/\s+(.+)\s+\(/).exec(str);
        var subtitle = (/\((.+)\)/).exec(str);
      
        return {
          "id": id && id[1],
          "Title": title && title[1],
          "Subtitle": subtitle && subtitle[1]
        };
      }
      
      console.log(getData(str));

      【讨论】:

      • 在某些情况下它可以工作,在其他情况下我的标题为空{ id: '1', Title: null, Subtitle: 'The Opening Chapter' }
      • 我编辑了它。它现在有效吗?另外,您使用什么字符串来产生不正确的结果?
      猜你喜欢
      • 2019-05-14
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      • 2022-11-12
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多