破折号如何在正则表达式中起作用?

时间:2013-06-21 19:57:57

标签: regex

我对使用-的正则表达式决定要包含哪些字符的算法感到好奇......

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

因为A65,而z122所以从理论上讲,它也应匹配这些值之间的所有字符。

2 个答案:

答案 0 :(得分:4)

你的两个假设都是正确的。 (因此,从技术上讲,你可以做[#-~]它仍然有效,捕获大写字母,小写字母,数字和某些符号。)

ASCII Table

您也可以使用Unicode执行此操作,例如[\u0000-\u1000]

但是,您不应该[A-z],因为大写和小写字母之间有一些字符(特别是[, \, ], ^, _, `)。

答案 1 :(得分:4)

来自MSDN - Character Classes in Regular Expressions(粗体是我的):

  

指定字符范围的语法如下:

[firstCharacter-lastCharacter]
  

其中firstCharacter是开始范围的字符,lastCharacter是结束范围的字符。字符范围是一系列连续的字符,通过指定系列中的第一个字符,连字符(-),然后是系列中的最后一个字符来定义。 如果两个字符具有相邻的Unicode代码点,则它们是连续的。

所以你的假设是正确的,但实际上效果更广泛: Unicode字符代码,而不仅仅是ASCII。