Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中标记整个正则表达式?_Javascript_Regex_Matching_Regex Group - Fatal编程技术网

如何在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