如何制作便携式正则表达式?

时间:2010-05-16 09:54:25

标签: regex portability

正则表达式的哪些特征是标准的,哪些是特殊的? 如果我想在不同的上下文,语言,平台中使用相同的正则表达式,我该怎么做,而不是做什么?

2 个答案:

答案 0 :(得分:4)

没有标准,但如果您的目标是最大可移植性,那么您应该坚持使用JavaScript正则表达式支持的功能。所有其他主要口味都支持JS所做的一切,只有很小的变化。例如,有些只支持POSIX字符类表示法([:alpha:]),而有些则使用Unicode语法(\p{Alpha})。

最麻烦的变化可能是那些影响点(.)和锚点(^$)的变体。例如,JavaScript没有DOTALL(或“单行”)模式,因此要匹配任何包括换行符,您必须使用像[\s\S]这样的黑客。同时,Ruby有一个DOTALL模式,但称之为多行模式 - 每个人其他调用“多行”(^$作为行锚点)Ruby是如何工作的。

也要注意点与点不匹配(在默认模式下)。传统上,这只是换行符(\n),但越来越多的口味正在采用(或至少近似)有关行分隔符的Unicode guidelines。例如,在Java中,点与[\r\n\u0085\u2028\u2029]中的任何一个都不匹配,而^$\r\n视为单个分隔符,并且两个字符之间不匹配

请注意,我只是谈论 Perl派生的风格,如Python,Ruby,PHP,JavaScript等。如果像grep那样包含基于GNU或POSIX的风格是没有意义的,awk和MySQL;它们的功能往往较少,但这并不是你想要的功能。

我也没有包含XML Schema风格;它比JavaScript更受限制,但它是一个专门的应用程序。例如,它不支持锚点(^$\A\Z等),因为匹配始终锚定在两端。

答案 1 :(得分:1)

在这里你可以找到一个好的reference。 在这里,你有关于这个主题的最好的book。 然后在此page中,在语言功能(第1部分和第2部分)下,您可以看到一些差异