红宝石中/ \ p {Alpha} / i和/ \ p {L} / i之间有什么区别?

时间:2012-11-22 16:51:53

标签: ruby regex

我正在尝试在ruby中构建一个正则表达式以匹配UTF-8中的字母字符,例如ñíóúü等。我知道/\p{Alpha}/i有效且/\p{L}/i也有效但有什么区别?

1 个答案:

答案 0 :(得分:10)

他们似乎是等同的。 (编辑:有时,请参阅此答案的结尾)

从版本1.9开始,Ruby似乎支持\p{Alpha}。在POSIX中\p{Alpha}等于\p{L&}(对于支持Unicode的正则表达式; see here)。这匹配所有具有大小写变体(see here)的字符。 Unicase字母不匹配(虽然它们将匹配\p{L}

Ruby似乎不是这样(我选择了一个随机的阿拉伯字符,因为阿拉伯语有一个unicase字母表):

这似乎是一个很好的迹象,\p{Alpha}只是Ruby中\p{L}的别名。在Rubular上,您还可以看到Ruby 1.8.7中没有\p{Alpha}

请注意,i修饰符在任何情况下都无关紧要,因为无论如何\p{Alpha}\p{L}都会匹配大写和小写字符。

修改

哈哈,有区别!我刚刚找到了this PDF关于Ruby的新正则表达式引擎(如上所述在Ruby 1.9中使用)。无论编码如何,\p{Alpha}都可用(如果没有Unicode支持,可能只匹配[A-Za-z]),而\p{L}特别是Unicode属性。这意味着,\p{Alpha}的行为与POSIX正则表达式完全相同,不同之处在于此处对应于\p{L},但在POSIX中,它对应于\p{L&}