我的意思,而不是爲什麼你不能在Regexes中定義你自己的自定義charclasses?
/^[asdfjkl;]foo[asdfjkl;]bar[asdfjkl;]baz$/i
甚至
RegExp('^[[:HOMEROW:]]foo[[:HOMEROW:]]bar[[:HOMEROW:]]baz$'.replace(/\[:HOMEROW:]/g, 'asdfjkl;'))
我可能只是能寫:
/\H=[asdfjkl;];^\Hfoo\Hbar\Hbaz$/
我的意思,而不是爲什麼你不能在Regexes中定義你自己的自定義charclasses?
/^[asdfjkl;]foo[asdfjkl;]bar[asdfjkl;]baz$/i
甚至
RegExp('^[[:HOMEROW:]]foo[[:HOMEROW:]]bar[[:HOMEROW:]]baz$'.replace(/\[:HOMEROW:]/g, 'asdfjkl;'))
我可能只是能寫:
/\H=[asdfjkl;];^\Hfoo\Hbar\Hbaz$/
既然你問的是一個哲學問題(對於像SO這樣的網站來說,這些問題並不是很好的問題),讓我試着給出一個寧肯推測性答案。畢竟,我不會爲語言設計人員說話,但我可以猜測:
通常,當正則表達式變得如此怪異時,這是一個可靠的標誌,表示正則表達式不適合工作。所以某種程度上,自定義字符類會鼓勵糟糕的編程(比如試圖用正則表達式來驗證電子郵件地址)。我懷疑這就是爲什麼沒有足夠聰明來定義正則表達式標準的人選擇實現這個功能。
例如,如果你的目標是找到電子郵件地址,那麼它可能是最好做一個非常基本的掃描一個基本的正則表達式像
\[email protected]\S+\.\S+
,然後看着一個專門的電子的結果郵件地址解析器清除/修剪不匹配。
一個更好的例子可能是日期驗證:
您使用正則表達式
^(?:(?:(?:(?:(?:0?[13578]|1[02])\/31)|(?:(?:0?[13-9]|1[0-2])\/(?:29|30)))\/(?:1[6-9]|[2-9]\d)\d{2})|(?:0?2\/29\/(?:(?:(?:1[6-9]|[2-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))\/(?:0?[1-9]|1\d|2[0-8])\/(?:(?:1[6-9]|[2-9]\d)\d{2}))$
可以驗證MM/DD/YYYY的日期,但你應該願意使用像
正則表達式^\d\d/\d\d/\d\d\d\d$
並使用日期解析器在第二步中計算出有效日期。
我知道這是對主觀問題的主觀回答,所以我可以接受downvote,但如果可能的話,我希望聽到它的原因。 –
哈哈,你是不是剛剛把你的頭頂上的那個MM/DD/YYYY正則表達式,還是它的副本?我喜歡你的回答,但它看起來像CSS中的':parent'假選擇器 - 說明符和實現者不應該有意地限制開發者「爲了他們自己的好處」。 – wwaawaw
@adlwalrus:我從一個[早期的答案]複製它(http://stackoverflow.com/questions/4290433/regular-expression-for-aspregularexpressionvalidator-with-format-mmddyy-leap-y/4291747#4291747)(其中我專門寫了一些文字來證明爲什麼正則表達式不適合所有理論上可用的目的) –
你可以爲正則表達式創建一個包裝對象:
myRegExp = function(regex,mods) {
var customclasses = {
nonDotLocalChar:'A-Za-z0-9!#$%&\'*+-/=?^_`{|}~'
}, i;
for(i in customclasses) {
regex = regex.replace(new RegExp("\[:(\^?)"+i+":\]","i"),"$1"+customclasses[i]);
}
return new RegExp(regex,mods);
};
然後可以使用上面,像這樣:
你也可以用它喜歡:
new myRegExp("[[:^nondotlocalchar:]]"); // negates the custom class
new myRegExp("[@[:nondotlocalchar:]]"); // allow anything from the custom class, or the @ character
你能簡化你的正則表達式嗎? – elclanrs
*「我對這個*的哲學方面更感興趣,這使它不適合SO。 –