2013-06-21 41 views
4

我在算法好奇的使用-時決定包括哪些字符,在正則表達式...破折號如何在正則表達式中工作?

Example: [a-zA-Z0-9] 

這到9任何情況下,任何字符,A到Z和數字0一致。

我原本以爲他們使用有點像宏,例如,a-z轉化爲a,b,c,d,e等。但我看到後在open source project以下,

text.tr('A-Za-z1-90', 'Ⓐ-Ⓩⓐ-ⓩ①-⑨⓪') 

我關於正則表達式的範例已經完全改變了,因爲這些是不是你典型人物的角色,所以我認爲自己是如何正確工作的。

我的理論是,-字面意思

左側字符之間的任何ASCII值,以及正確的漢字。 (例如a-z [97-122])

有人能證實我的理論是否正確?真正的正則表達式模式是否使用任何字符之間的字符代碼進行計算?

此外,如果它是正確的,你能執行一個正則表達式匹配一樣,

A-z 

因爲A65,並z122所以理論上,它也應該與這些值之間的所有字符。

+1

嘗試一下:http://rubular.com/r/ULLy143jQu – ctn

+0

這樣做,這就是人們使用'A-Za-z'而不是'Az'的原因(所以他們沒有得到'Za' – smerny

+0

爲什麼你不試試? – Aravind

回答

4

MSDN - Character Classes in Regular Expressions(粗體是礦):

用於指定字符範圍的語法如下:

[firstCharacter-lastCharacter] 

其中firstCharacter是開頭的範圍內的字符lastCharacter是結束範圍的字符。字符範圍是通過指定系列中的第一個字符,連字符(-),然後是系列中的最後一個字符來定義的連續字符系列如果兩個字符具有相鄰的Unicode代碼點,則它們是連續的。

所以你的假設是正確的,但效果是,事實上,更廣泛的:Unicode字符代碼,而不僅僅是ASCII。

+0

檢查出來:http://regexr.com?35agt – acdcjunior

+0

'如果兩個字符有相鄰的Unicode代碼點,它們是連續的。「 - 這正是我想聽到的。謝謝! – sircapsalot

4

你的兩個假設都是正確的。 (因此,在技術上你可以做[#-~],它仍然將是有效的,捕捉大寫字母,小寫字母,數字和特定符號。)

ASCII Table

你也可以做到這一點使用Unicode,像[\u0000-\u1000]

但是,您不應該這樣做[A-z],因爲大寫字母和小寫字母之間有一些字符(特別是[, \, ], ^, _, `)。

+0

是啊 - 我明白了。 '],['和其他幾個 – sircapsalot

+0

將ASCII表放在答案中是不需要的,你可以只給出一個鏈接。 – anubhava

+0

謝謝門把手,我很欣賞答案!這對此有所瞭解。 – sircapsalot

相關問題