如何在JavaScript中标记整个正则表达式?
我试图解析时间字符串并将它们转换成一个对象,我将调用如何在JavaScript中标记整个正则表达式?,javascript,regex,matching,regex-group,Javascript,Regex,Matching,Regex Group,我试图解析时间字符串并将它们转换成一个对象,我将调用时间模块。它只是一个简单的dictionary对象,完全公开了时间 问题是我必须匹配由数字和时间单位组成的字符串。目前我正在尝试匹配此正则表达式: /^([1-9][0-9]*)(y | m | w | d | h | min | s)+$/g 我需要它来赢得每一场比赛。因此,如果我给它输入以下字符串:12y12m12w12d12h12min12s-它应该返回如下数组: [ '12y12m12w12d12h12min12s', /
时间模块
。它只是一个简单的dictionary对象,完全公开了时间
问题是我必须匹配由数字和时间单位组成的字符串。目前我正在尝试匹配此正则表达式:/^([1-9][0-9]*)(y | m | w | d | h | min | s)+$/g
我需要它来赢得每一场比赛。因此,如果我给它输入以下字符串:12y12m12w12d12h12min12s
-它应该返回如下数组:
[
'12y12m12w12d12h12min12s', // Matching string
'12y',
'12',
'y',
'12m',
'12',
'm',
'12w',
'12',
'w',
'12d',
'12',
'd',
'12h',
'12',
'h',
'12min',
'12',
'min',
'12s',
'12',
's',
index: 0,
input: '12y12m12w12d12h12min12s',
groups: undefined
]
相反,它只返回最后一个单位:
[
'12y12m12w12d12h12min12s',
'12s',
'12',
's',
index: 0,
input: '12y12m12w12d12h12min12s',
groups: undefined
]
我可以使用
regex
执行此操作吗?如何匹配?您不应该尝试一次匹配整个输入,因为带有+
后缀的捕获组实际上只捕获最后一个匹配
而是迭代子匹配项。如果您要求整个字符串最终匹配,而不中断任何字符序列,则调整您的正则表达式,以便它也匹配单独捕获组中的偏离字符:
let regex=/([1-9][0-9]*)(y | min | m | w | d | h | s)|()/g
设s=“12y12m12w12d12h12min12s”;
让matches=[…s.matchAll(regex)];
console.log(匹配项)代码>捕获组仅捕获上次匹配的
如果您移除锚固件并展平结果,将在ES2020中发布的新版本(且易于填充)将与您非常接近:
const rex = /([1-9][0-9]*)(y|min|m|w|d|h|s)/g;
const str = "12y12m12w12d12h12min12s";
const array = [...str.matchAll(rex)].flat();
console.log(array);
这不会提供整个字符串匹配(如果需要,请插入数组),但会提供其余所有内容:
实例:
const rex=/([1-9][0-9]*)(y | min | m | w | d | h | s)/g;
const str=“12y12m12w12d12h12min12s”;
常量数组=[…str.matchAll(rex)].flat();
console.log(数组)代码>
。作为控制台包装器{
最大高度:100%!重要;
}
输出数组是否需要按该顺序排列?@CertainPerformance不一定。我只是想让它和时间相符。问题是时间模块应该为我检查时间字符串的匹配情况。这与OP说的他们想要的并不完全一致。@T.J.Crowder,谢谢你的鼓励性评论。OP写了“类似的东西”。我想我遇到过。@T.J.Crowder,我看到你现在已经调整了你的答案,使用了(几乎)我在答案中建议的相同方法,包括我添加的扁平化。@trincot-我没有看到你添加了它。好的加法。但是,是的,我也想到了matchAll
,然后进行了一个循环,然后离开并意识到为什么matchAll
最初对我不起作用(我删除了太多的捕获组),所以我回来并添加了它。我没有照着你的意思复制它。(事实上,看看你的,它们完全不同。)我仍然喜欢我做的额外检查,这与OP的正则表达式的^
和$
要求相对应。但我看到他们接受了你的答案(尽管我先发布了这个,但没问题),所以这对他们来说似乎不是一个重要的要求。尽管如此,我认为我会坚持完全不同的方法。因为我需要匹配整个字符串,而不仅仅是部分。如果有不属于那里的内容,它需要返回null
。问题是我将使用它来验证给定字符串中的时间表达式。我想我会挖掘出我的旧代码,并将其集成到我的新代码中。不过还是要谢谢你:)@Polda18-验证完整字符串,第二个代码段(在我写这条评论时)可能就是你想要的。(它不包括结果中的完整字符串,但如果你需要的话,可以在检查后轻松添加。)@TJCrowder不,我的意思是我需要整个字符串只匹配指定的时间格式。也就是说,我不想在该字符串中包含任何其他内容,因此,如果有不属于该字符串的内容,它将不返回匹配项。我已经设法找回了代码(幸运的是,我还没有删除我的旧代码)。最后我要用的正则表达式是:/^(?[1-9][0-9]*y)?([1-9][0-9]*m)?([1-9][0-9]*w)?([1-9][0-9]*d)?([1-9][0-9]*h)?([1-9][0-9]*min)?([1-9][0-9]*s?)$/I