如何使用" RegExp.exec"在TypeScript?

时间:2017-04-17 06:14:08

标签: typescript

我想使用方法" 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) {

它仍然无法运作。那么如何为这种情况编写循环条件呢?

3 个答案:

答案 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));
}

为什么原件不起作用: 原始代码声明resultRegExpExecArray类型。此类型与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)];

MDN recommends it as an alternativehere are the docs

答案 2 :(得分:0)

我想从字符串下面捕获小时和分钟

18h:20m

所以,我使用以下表达式

const [, hours, minutes] = /^(\d+)[:h -]\s?(\d+)m?$/.exec(string) || ['', '', ''];

您可以根据要捕获的匹配项的数量对其进行自定义。

注意:exec()将以字符串类型返回所有​​匹配项。