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

dug*_*res 6 regex portability

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

Ala*_*ore 6

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

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

还要注意点不匹配的确切内容(在默认模式下)。传统上这只是换行符 ( \n),但越来越多的风格正在采用(或至少近似)关于行分隔符的Unicode 准则。例如,在 Java 中,点不匹配[\r\n\u0085\u2028\u2029], while^和中的任何一个,并且$将其\r\n视为单个分隔符并且不会在两个字符之间匹配。

请注意,我只是在谈论Perl 派生的风格,如 Python、Ruby、PHP、JavaScript 等。包含基于 GNU 或 POSIX 的风格(如 grep、awk 和 MySQL)是没有意义的;它们的功能往往较少,但无论如何您都不会选择它们。

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