假设我有一个正则表达式
^foobar$
我可以放心地假设它是常数(它只会匹配foobar
,而不会匹配其他任何东西)。
现在假设我有以下内容
^foo.ar$
现在它不是常数,因为.
可以匹配任何字符。
是否有任何标准方法来检查正则表达式模式(在我的情况下为PCRE)是否恒定?我是否应该天真地为不带有反斜杠的常见字符(例如(){}[]?.+*
)“正则表达式”?
我正在编写一个静态分析工具,当使用常量模式时,应该建议使用基于字符串的简单函数替换某些PCRE驱动的函数。
答案 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