【问题标题】:Shared Regex patterns across platforms跨平台共享正则表达式模式
【发布时间】:2015-06-25 17:20:58
【问题描述】:

我们正在尝试跨多个平台(应用程序 (Android/iOS)、Web (javascript) 和后端服务 (C#))共享我们的 RegEx 模式。

我预见到的一个问题是所有平台都有不同的正则表达式引擎。可能导致其中一个错误地处理正则表达式模式。

正则表达式模式最初是在 C# 中定义的,然后通过 Webservice 或 Bower 暴露给其他平台。无论如何要为该模式编写一个单元测试以确保它可以在其他平台上工作?

我问这个问题的原因是因为我假设有一种通用的正则表达式语言,并且每个引擎都有自己独特的怪癖。如果是这样,应该可以验证每种模式是否符合普遍理解的语言。

【问题讨论】:

    标签: regex cross-platform


    【解决方案1】:

    我建议选择支持最少正则表达式功能的标准作为基础,即 Javascript

    也就是说,regular-expressions.info 列出了 JavaScript 中可用的内容:

    • gim 标志,不支持内联标志
    • 反斜杠在 JavaScript 中被转义
    • 代替(?s)修饰符,使用[\s\S]
    • 没有\A\Z 锚来匹配字符串的开头或结尾。请改用插入符号或美元。
    • 根本不支持 Lookbehind。完全支持前瞻。
    • 没有原子分组或所有格量词。
    • 不支持 Unicode,除了将单个字符与 \uFFFF 匹配。
    • 没有命名的捕获组。改为使用编号的捕获组。
    • 没有模式修饰符可以在正则表达式中设置匹配选项。
    • 无条件。
    • 没有正则表达式 cmets。使用 JavaScript // cmets 描述您的正则表达式,而不是在正则表达式字符串之外。

    此外,在字符类中使用明确的转义(即主要用于-][ 字符,必须对其进行转义以避免混淆)。

    请注意,在 Java 正则表达式字符串中,反斜杠必须进行双重转义。

    正如@nhahdth 提到的,避免使用速记类,而是使用字符类。 \w 在您不需要匹配 Unicode 字母时可能会成为真正的罪魁祸首,只需提及您需要 [a-zA-Z0-9_] 是安全的。

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多