2017-04-17 210 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

相關問題