如何验证正则表达式模式是否为常量模式?

时间:2019-07-18 13:36:36

标签: regex pcre

假设我有一个正则表达式

^foobar$

我可以放心地假设它是常数(它只会匹配foobar,而不会匹配其他任何东西)。

现在假设我有以下内容

^foo.ar$

现在它不是常数,因为.可以匹配任何字符。

是否有任何标准方法来检查正则表达式模式(在我的情况下为PCRE)是否恒定?我是否应该天真地为不带有反斜杠的常见字符(例如(){}[]?.+*)“正则表达式”?

我正在编写一个静态分析工具,当使用常量模式时,应该建议使用基于字符串的简单函数替换某些PCRE驱动的函数。

1 个答案:

答案 0 :(得分:1)

考虑使用现有的正则表达式解析器,该解析器输出AST

以JavaScript为例:
https://www.npmjs.com/package/regjsparser
https://github.com/jviereck/regjsparser

此处的演示页面可让您查看生成的AST:
http://www.julianviereck.de/regjsparser/

对于^foobar$
http://www.julianviereck.de/regjsparser/#%2F%5Efoobar%24%2Fiu

对于^foo.ar$
http://www.julianviereck.de/regjsparser/#%2F%5Efoo.ar%24%2Fiu

然后您可以在AST中搜索“类型”,在这种情况下,第二个示例包括“点”类型:

    {
      "type": "dot",
      "range": [
        4,
        5
      ],
      "raw": "."
    },

您可能还会检查“ characterClass”和其他字符,否则建议只包含“允许列表”。

还请注意,有一个JS库可从AST生成正则表达式:
https://www.npmjs.com/package/regjsgen
https://github.com/bnjmnt4n/regjsgen