2017-04-17 207 views
0

我想在RegExp中使用“exec”方法。我下面写的代码来尝试做:如何在TypeScript中使用“RegExp.exec”?

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

你尝试'让结果:RegExpExecArray |空;'?或者完全忽略这个类型,让TS弄清楚。 – 2017-04-29 03:52:25

回答

0

你需要把它写这样的:

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

应该工作

+0

是的,这种风格应该工作。这是使它在ts中工作的唯一方法吗? – v11

+0

您可以使用while循环,但是您必须在循环内部和外部编写'result = expression.exec(text);'两次。而且,这种方式可以删除丑陋的类型断言,并可以将'result'范围保留在循环中。如果你只想要所有的匹配,为什么不使用'/ g'标志并且完全跳过一个循环? –

+0

我只想要所有的匹配,你可以提供更多使用/ g标志的细节吗?谢谢 – v11

相关问题