ruby中/ \ p {Alpha} / i和/ \ p {L} / i之间有什么区别?
我正在尝试在ruby中构建一个正则表达式以匹配UTF-8中的字母字符,例如ñíóúü
等。我知道/\p{Alpha}/i
作品和/\p{L}/i
作品也有效但有什么区别?
它们似乎是等价的。 ( 编辑:有时,看到这个答案的结尾)
从版本1.9开始,Ruby似乎支持\p{Alpha}
。 在POSIX \p{Alpha}
中等于\p{L&}
(对于支持Unicode的正则表达式; 请参见此处 )。 这匹配所有具有大小写变体的字符( 请参见此处 )。 Unicase字母不匹配(而它们将匹配\p{L}
。
这似乎不适用于Ruby(我选择了一个随机的阿拉伯字符,因为阿拉伯语有一个unicase字母表):
-
\p{L}
(任何字母)匹配。 - 区分大小写的类
\p{Lu}
,\p{Ll}
,\p{Lt}
不匹配。 正如所料。 -
p{L&}
不匹配。 正如所料。 -
\p{Alpha}
匹配。
这似乎是一个非常好的迹象, \p{Alpha}
只是Ruby中\p{L}
的别名。 在Rubular上,您还可以看到\p{Alpha}
在Ruby 1.8.7中不可用。
请注意, i
修饰符在任何情况下都无关紧要,因为无论如何, \p{Alpha}
和\p{L}
匹配大写和小写字符。
编辑:
哈哈,有区别! 我刚刚发现了这个关于Ruby的新正则表达式引擎的PDF (如上所述,正在使用Ruby 1.9)。 无论编码如何, \p{Alpha}
都可用(如果没有Unicode支持,可能只匹配[A-Za-z]
),而\p{L}
特别是Unicode属性。 这意味着, \p{Alpha}
行为与POSIX正则表达式完全相同,不同之处在于此处对应于\p{L}
,但在POSIX中它对应于\p{L&}
。