[英]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}
alpha-numeric-id
可以包括-
字符和数字numeric-id
始终是一个数字,并且是可选的。alpha-numeric-id
和numeric-id
可以用-
或/
分隔我想在一个步骤中解析出alpha-numeric-id
和numeric-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.