繁体   English   中英

有人可以建议使用单行正则表达式来解析带有 - 或 / 分隔符的字母数字和可选数字 ID 吗?

[英]Can someone suggest a one-line regex to parse out alphanumeric and optional numeric ids with either a - or / separator?

我正在尝试解析一组遵循以下模式的字符串

{alpha-numeric-id}-{numeric-id}

或者

{alpha-numeric-id}/{numeric-id}
  1. alpha-numeric-id可以包括-字符和数字
  2. numeric-id始终是一个数字,并且是可选的。
  3. alpha-numeric-idnumeric-id可以用-/分隔

我想在一个步骤中解析出alpha-numeric-idnumeric-id (如果有的话)。

例子

'ThePixies1996' => { 1: 'ThePixies1996', 2: '' }
'7ThePixies' => { 1: '7ThePixies', 2: '' }
'The-Pixies' => { 1: 'The-Pixies', 2: '' }
'The-Pixies-1234567' => { 1: 'The-Pixies', 2: '1234567' }
'The-Pixies/1234567' => { 1: 'The-Pixies', 2: '1234567' }

到目前为止,我想出的最简单的方法如下:

const parse = str => {
  const numeric = str.match(/[-\/]([0-9]+)/)

  return numeric
    ? {
      numericId: numeric[1],
      alphaNumericId: str.slice(0, -1 * (numeric[1].length + 1))
    }
    : {
      numericId: '',
      alphaNumericId: str
    }
}

有没有更简单的方法?

如果您知道要做什么,正则表达式会简单得多。 话虽如此,这将是一个理想的解决方案:

^([\da-z-]+?)(?:[-/](\d+))?$

解释:

  • ^匹配字符串开头
  • ([\\da-z-]+?)匹配并捕获包含- (非贪婪)的字母数字字符串
  • (?:[-/](\\d+))? 匹配以字符开头的字符串-/跟在一系列数字(被捕获)之后(可选)
  • $字符串结尾

观看现场演示

JS代码:

 var matches = []; 'The-Pixies/12345'.replace(/^([\\da-z-]+?)(?:[-/](\\d+))?$/ig, function(m, $1, $2) { matches.push($1, $2); }) console.log(matches.filter(Boolean));

您可以使用

(.+?)(?:[\/-](\d+))?$

https://regex101.com/r/PQSmaA/1/

通过延迟重复任何字符来捕获组中的alphaNumericId ,然后可以选择有一组破折号或正斜杠,后跟在另一组中捕获的数字numericId 解构匹配并为 numericId 分配一个默认值(空字符串)以快速返回所需的对象:

 const input = ['ThePixies1996', '7ThePixies', 'The-Pixies', 'The-Pixies-1234567', 'The-Pixies/1234567' ]; function parse(str) { const [_, alphaNumericId, numericId = ''] = str.match(/(.+?)(?:[\\/-](\\d+))?$/); return { alphaNumericId, numericId }; } console.log( input.map(parse) );

那是假设输入总是有效的,就像你的parse函数一样。 如果不是,并且您还需要测试输入是否为所需格式,请使用字符集而不是. , 并在所需格式不匹配时抛出或其他内容:

 const input = ['ThePixies1996', '7ThePixies', 'The-Pixies', 'The-Pixies-1234567', 'The-Pixies/1234567', 'invalid/input/string' ]; function parse(str) { const match = str.match(/^([az\\d-]+?)(?:[\\/-](\\d+))?$/i); if (!match) return 'INVALID'; const [_, alphaNumericId, numericId = ''] = match; return { alphaNumericId, numericId }; } console.log( input.map(parse) );

您可以以更简单的方式在没有正则表达式的情况下完成

const parse = (data) => {
    let inx = data.lastIndexOf("-")
    if (inx === -1 || isNaN(data.slice(inx))){
        inx = data.lastIndexOf("/")  
    }
    return {
          numericId: data.slice(0, inx),
          alphaNumericId: data.slice(inx+1)
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM