我对使用-
的正则表达式决定要包含哪些字符的算法感到好奇......
Example: [a-zA-Z0-9]
这匹配任何情况下的任何字符,a到z,以及数字0到9.
我原本以为它们的用途有点像宏,例如a-z
转换为a,b,c,d,e
等等。但是在我看到open source project中的以下内容之后,
text.tr('A-Za-z1-90', 'Ⓐ-Ⓩⓐ-ⓩ①-⑨⓪')
我对正则表达式的范例已经完全改变了,因为这些字符不是你的典型字符,所以这对我的工作有多么正确,我心里想。
我的理论是-
字面意思是
左侧角色和右侧角色之间的任何ASCII值。 (例如a-z [97-122])
有人能证实我的理论是否正确吗?正则表达式模式实际上是在任何字符之间使用字符代码计算的吗?
此外,如果它是正确的,你可以执行正则表达式匹配,如
A-z
因为A
是65
,而z
是122
所以从理论上讲,它也应匹配这些值之间的所有字符。
答案 0 :(得分:4)
你的两个假设都是正确的。 (因此,从技术上讲,你可以做[#-~]
它仍然有效,捕获大写字母,小写字母,数字和某些符号。)
您也可以使用Unicode执行此操作,例如[\u0000-\u1000]
。
但是,您不应该[A-z]
,因为大写和小写字母之间有一些字符(特别是[, \, ], ^, _, `
)。
答案 1 :(得分:4)
来自MSDN - Character Classes in Regular Expressions(粗体是我的):
指定字符范围的语法如下:
[firstCharacter-lastCharacter]
其中
firstCharacter
是开始范围的字符,lastCharacter
是结束范围的字符。字符范围是一系列连续的字符,通过指定系列中的第一个字符,连字符(-
),然后是系列中的最后一个字符来定义。 如果两个字符具有相邻的Unicode代码点,则它们是连续的。
所以你的假设是正确的,但实际上效果更广泛: Unicode字符代码,而不仅仅是ASCII。