我想使用方法" exec"在RegExp中。我写下面的代码试图做:
let result = <RegExpExecArray>{};
while (result = expressionCheck.exec(text)) {
let matchIndex = result.index;
let t = result[0].length;
matchRanges.push(new RegRange(matchIndex, t));
}
但它引发了错误:
Build:Type 'RegExpExecArray | null' is not assignable to type 'RegExpExecArray'.
我尝试将循环条件修改为:
while ((result = expressionCheck.exec(text)) != null) {
它仍然无法运作。那么如何为这种情况编写循环条件呢?
答案 0 :(得分:2)
你需要这样写:
let result;
while ((result = expression.exec(text)) !== null) {
let matchIndex = result.index;
let t = result[0].length;
matchRanges.push(new RegRange(matchIndex, t));
}
为什么原件不起作用:
原始代码声明result
为RegExpExecArray
类型。此类型与exec
的返回类型RegExpExecArray | null
不兼容。尽管缩小了!== null
,代码仍会将null
分配给result
。这就是为什么它是一个错误。
您也可以按以下方式编写。
for (let result = expression.exec(text); result !== null; result = expression.exec(text)) {
const matchIndex = result.index;
const t = result[0].length;
matchRanges.push(new RegRange(matchIndex, t));
}
答案 1 :(得分:1)
我发现String.prototype.matchAll
更具可读性,因为我可以对其进行分解:
const [[group1, group2]] = [...text.matchAll(expressionCheck)];
答案 2 :(得分:0)
我想从字符串下面捕获小时和分钟
18h:20m
所以,我使用以下表达式
const [, hours, minutes] = /^(\d+)[:h -]\s?(\d+)m?$/.exec(string) || ['', '', ''];
您可以根据要捕获的匹配项的数量对其进行自定义。
注意:exec()将以字符串类型返回所有匹配项。