我在 JavaScript 中使用以下正則運算式來驗證輸入欄位:
<textarea
id="kpf-message-textarea"
class="message-area"
name="message"
maxlength="1000"
aria-describedby="kpf-message-extra-text"
aria-invalid="true"
tabindex={this.kpfTabindex}
value={this.message}
onInput={(event) => this._handleChange(event)}>
</textarea>
this.message.match(/^([A-Za-z]|[0-9]|
[àá??????èéê?ìí??D?òó????ùú?üYT?àáa?????èéê?ìí??e?òó????ùú?üyt?]|[ \\.^°!"2§3$%&\/\\{\\}\\
(\\)=?′`@€ -\\*~'#<>|μ,;:_<CR><LF>]|[\n]) $/)
對于以下 30 個大寫字母和 1 個無效字符的模式,它會導致瀏覽器掛起,只有再次關閉和打開瀏覽器才有幫助:
ABCDEFGHIJKLMNOPAAAAAAAAAAAAAA?
這里有什么問題?
uj5u.com熱心網友回復:
由于災難性的回溯,該模式超時。
它無法匹配最后的字符?,它仍然會嘗試探索(回溯)所有路徑。對于外部重復組和該組內的交替,有很多選擇。
使用[<CR><LF>]的字符類是一樣的[><CFLR]。如果你想匹配一個回車,或者您可以使用一個換行符\r\n
當您|對所有單字符匹配(沒有量詞的字符類)使用交替時,您可以將所有字符類合并為單個字符類并重復該字符類 1 次或多次。
^[A-Za-z0-9àá??????èéê?ìí??D?òó????ùú?üYT?àáa?????èéê?ìí??e?òó????ùú?üyt? \\.^°!"2§3$%&/{} ()=?′`@€ *~'#<>|μ,;:_\r\n-] $
正則運算式演示
一個簡化的例子:
function handleChange() {
let elm = document.getElementById("kpf-message-textarea");
if (/^[A-Za-z0-9àá??????èéê?ìí??D?òó????ùú?üYT?àáa?????èéê?ìí??e?òó????ùú?üyt? \\.^°!"2§3$%&/{} ()=?′`@€ *~'#<>|μ,;:_\r\n-] $/.test(elm.value)) {
console.log("Match: " elm.value);
} else {
console.log("No match: " elm.value);
}
}
<textarea id="kpf-message-textarea" class="message-area" name="message" maxlength="1000" aria-invalid="true" onInput=handleChange()>
</textarea>
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/316096.html
標籤:javascript 正则表达式 打字稿
上一篇:正則運算式提取、洗掉重復項并在Google表格中使用管道連接
下一篇:如何匹配數字和點序列?
