在登錄時,我只需要允許用戶名(字母數字和一些特殊字符)或電子郵件地址或用戶名\域格式。為此,我將此正則運算式與 or ( |) 條件結合使用。除此之外,我需要允許一些其他語言字符,如日語、中文等,因此也將這些字符包含在同一個正則運算式中。現在,問題是當我輸入字符 (>=30) 和/@或某些特殊字符時,此正則運算式的評估需要幾秒鐘,并且瀏覽器進入掛起模式。
export const usernameRegex = /(^[a-zA-Z0-9._~^#!% \-] @[a-z0-9.-] \.[a-z]{2,4}) |^[a-zA-Z0-9._~^#!\-] \\([._-~^#!]|[\p{Ll}\p{Lm}\p{Lt}a-zA-Z0-9-\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\uff9f\u4e00-\u9faf\u3400-\u4dbf\u3130-\u318F\uAC00-\uD7AF]) |^([._-~^#!]|[\p{Ll}\p{Lm}\p{Lt}a-zA-Z0-9-\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\uff9f\u4e00-\u9faf\u3400-\u4dbf\u3130-\u318F\uAC00-\uD7AF]) $/gu;
當我嘗試洗掉其他語言字符集時,[\p{Ll}\p{Lm}\p{Lt}a-zA-Z0-9-\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\uff9f\u4e00-\u9faf\u3400-\u4dbf\u3130-\u318F\uAC00-\uD7AF]) |^([._-~^#!]|[\p{Ll}\p{Lm}\p{Lt}a-zA-Z0-9-\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\uff9f\u4e00-\u9faf\u3400-\u4dbf\u3130-\u318F\uAC00-\uD7AF]它作業正常。
我知道通常正則運算式看起來很簡單,但它在引擎蓋下做了很多。在這個正則運算式中是否需要進行任何修改,以便不需要時間來評估。任何幫助深表感謝!
有效文本:
stackoverflow,
stackoverflow1~,
stackoverflow!#~^-,
stackoverflow@g.co,
stackoverflow!#~^-@g.co,
こんにちは,
你好,
tree\guava
編輯:
例如導致問題 stackoverflowstackoverflowstackoverflow@ 的輸入
給出上述文本需要很長時間。
https://imgur.com/T2Vg4lg
uj5u.com熱心網友回復:
您的正則運算式似乎由三個連接在一起的正則運算式組成 |
(^[a-zA-Z0-9._~^#!% \-] @[a-z0-9.-] \.[a-z]{2,4})
^[a-zA-Z0-9._~^#!\-] \\([._-~^#!]|[\p{Ll}\p{Lm}\p{Lt}a-zA-Z0-9-\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\uff9f\u4e00-\u9faf\u3400-\u4dbf\u3130-\u318F\uAC00-\uD7AF])
^([._-~^#!]|[\p{Ll}\p{Lm}\p{Lt}a-zA-Z0-9-\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\uff9f\u4e00-\u9faf\u3400-\u4dbf\u3130-\u318F\uAC00-\uD7AF]) $
第一個正則運算式
(^...)您認為從字串開頭開始的整個模式可以發生多少次。要么是第二次出現,要么從字串的開頭開始,不能同時出現。所以
^[a-zA-Z0-9._~^#!% \-] @[a-z0-9.-] \.[a-z]{2,4}第 2 部分和第 3 部分大部分相同,只有 nr. 2 包含此塊,
[a-zA-Z0-9._~^#!\-] \\然后是第 3 部分的其余部分。因此,讓我們將它們組合起來:
^(?:[a-zA-Z0-9._~^#!\-] \\)? ...并確保盡可能使用非捕獲組。([abc]|[def])可以簡化為[abcdef]。這個順便說一句。是扼殺你表現的部分。您的正則運算式以
$. 這只是最后一部分的一部分,但我假設您總是想匹配整個字串?所以讓我們制作所有 3 個(現在是 2 個)部分^ ... $
概括:
/^[a-zA-Z0-9._~^#!% -] @[a-z0-9.-] \.[a-z]{2,4}$|^(?:[a-zA-Z0-9._~^#!-] \\)?[._-~^#!\p{Ll}\p{Lm}\p{Lt}a-zA-Z0-9-\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\uff9f\u4e00-\u9faf\u3400-\u4dbf\u3130-\u318F\uAC00-\uD7AF] $/u
一個 JS 示例,一個簡單的正則運算式如何嘗試匹配一個字串,以及它如何失敗、回溯、與另一端重試|等等,等等。
// let's implement what `/([a-z]|[\p{Ll}]) /u` would do,
// how it would try to match something.
const a = /[a-z]/; // left part
const b = /[\p{Ll}]/u; // right part
const string = "abc,";
const testNextCharacter = (index) => {
if (index === string.length) {
return true;
}
const pattern = index " ".repeat(index 1) "%o.test(%o)";
const character = string.charAt(index);
console.log(pattern, a, character);
// checking the left part && if successful checking the next character
if (a.test(character) && testNextCharacter(index 1)) {
return true;
}
// checking the right part && if successful checking the next character
console.log(pattern, b, character);
if (b.test(character) && testNextCharacter(index 1)) {
return true;
}
return false;
}
console.log("result", testNextCharacter(0));
.as-console-wrapper{top:0;max-height:100%!important}
而這只有4個字符。您為什么不嘗試使用 5,6 個字符來了解 20 個字符的作業量。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/409284.html
標籤:
下一篇:Python中的正則運算式條件
