簡體   English   中英

[_ | \\ _ | \\。]的含義是什么? 在Javascript regexps?

[英]What is meaning of [_|\_|\.]? in Javascript regexps?

我有一個js代碼:

/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/

但是[_|\\_|\\.]的含義是什么?(js regexp)

如果我們使用像Regexper這樣的資源,我們可以將這個正則表達式可視化:

例

由此我們可以得出結論, [_|\\_|\\.]需要“_”,“|”之一 要么 ”。”。 我們還可以看到“_”和“|”的雙重聲明 沒必要。 正如HamZa評論的那樣 ,這段可以縮短為[_|.]以達到相同的效果。

事實上,我們甚至可以使用像Regexper這樣的資源來可視化整個表達式

它匹配管道字符,下划線或句點。
然而,這是不必要的錯綜復雜的。 它可能更簡單。

它可以縮短到這一點
[|_.]

REGEX101是理解正則表達式的非常好的工具

Char class [_|\_|\.] 0 to 1 times [greedy] matches:

[_|\_|\. One of the following characters _|_|.
 [_|\_|\.] requires one of either "_", "|" or "."

請參閱此RegEx101鏈接此處您的表達式說明

[_|\\_|\\.]可能意味着匹配下划線( _ )或句點( . ),並且應該寫為[_.]

我有理由相信作者使用管道( | )來表示“或”(即交替 ),這在字符類中是不必要的。 正如其他響應者所說,管道實際上與文字管道匹配,但我不認為這是作者的意圖。 這是一個非常常見的初學者的錯誤。

點( . )是另一個特殊字符,當它出現在字符類中時會失去其特殊含義。 沒有必要像作者那樣用反斜杠來逃避它,盡管它沒有任何傷害。 下划線從未有過任何特殊含義; 我甚至不會猜測為什么作者列出了兩次,一次使用反斜杠,一次沒有。

你沒有問過它,但是? 也不屬於那里。 正如Kobi所說 ,這正是使正則表達式非常低效的原因。 想法是匹配一個或多個字母數字,然后可選地匹配分隔符(點或下划線),必須跟隨一些更多的字母數字,並根據需要重復。 這是我寫的方式:

[a-zA-Z0-9]+([_.][a-zA-Z0-9]+)*

如果它用完了字母數字而下一個字符不是_. ,它跳過整個部分,並嘗試匹配下一部分。 如果它不能做到這一點,它可以立即紓困,因為不可能匹配。 但是你的正則表達式的編寫方式,分隔符是可選的,與它應該分離的東西無關,這使得它無用。 正則表達式引擎必須繼續備份,嘗試匹配它已經消耗的字符,它們可以放棄無休止,無意義的組​​合。 不幸的是,這是另一個常見的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM