2012-10-07 86 views
0

我的意思,而不是爲什麼你不能在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$/ 

如何有這個人的思想,並假設他們有,爲什麼它不享受更多的支持或實施?

注意:我對此的哲學方面更感興趣:排除該功能的基本原理是什麼?

+0

你能簡化你的正則表達式嗎? – elclanrs

+0

*「我對這個*的哲學方面更感興趣,這使它不適合SO。 –

回答

1

既然你問的是一個哲學問題(對於像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$ 

並使用日期解析器在第二步中計算出有效日期。

+1

我知道這是對主觀問題的主觀回答,所以我可以接受downvote,但如果可能的話,我希望聽到它的原因。 –

+0

哈哈,你是不是剛剛把你的頭頂上的那個MM/DD/YYYY正則表達式,還是它的副本?我喜歡你的回答,但它看起來像CSS中的':parent'假選擇器 - 說明符和實現者不應該有意地限制開發者「爲了他們自己的好處」。 – wwaawaw

+1

@adlwalrus:我從一個[早期的答案]複製它(http://stackoverflow.com/questions/4290433/regular-expression-for-aspregularexpressionvalidator-with-format-mmddyy-leap-y/4291747#4291747)(其中我專門寫了一些文字來證明爲什麼正則表達式不適合所有理論上可用的目的) –

2

你可以爲正則表達式創建一個包裝對象:

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 
+0

我對歷史/哲學的解釋更感興趣,因爲它沒有得到本地支持 - 它會在可讀性和可組合性方面走得很遠。讓我們做這種事情的理由是什麼? – wwaawaw

+1

通過這種推理,jQuery中的所有內容都應該可以在本地使用。這不是那件好事,但你看到我在說什麼嗎?JavaScript爲你提供了構建模塊,你必須把這些模塊搭建起來。 –

+1

這可能會很棒!我的意思是,正則表達式是內置的,DOM是宿主/環境,所以不完全正確,但如果DOM被jQuery取代,我相信很多人會爲此而歡樂! – wwaawaw

相關問題