正则表达式,用于在条件语句中查找意外分配

时间:2012-12-09 22:22:48

标签: regex language-agnostic

我不小心被一个你不小心在条件语句中分配变量的错误咬了一次,比如if

我正在寻找这些事件的来源。我创建了一个在PHP中用于简单案例的表达式,但是想知道是否有人可以优化它或处理更有趣的案例。

样品:

if ($var = 3)       //MATCH
if($var = 3)        //MATCH
if($var=3)          //MATCH
if ( $var = 3)      //MATCH
if ($var == $var2)  
if ($var = $var3)   //MATCH
if ( $var === 7)
if( $var == 8 || $var = 9) //MATCH
if (($var == 7 ) && ($var ==10))

简单案例由if\s*\([\$a-zA-Z\d\s]*=[\$a-zA-Z\d\s]*\)很好地处理,但是对于样本底部的扩展版本提供适用的东西会很好。

关于更好表达的任何想法?

2 个答案:

答案 0 :(得分:4)

正则表达式不是解析代码的最佳工具。

对于大多数语言,都有用于检查代码的linting工具。我没有使用PHP的经验,但你会在这里找到很多指示:Is there a static code analyzer [like Lint] for PHP files?

答案 1 :(得分:3)

首先,我们假设您没有这样的案例(C示例):

if ((a = b) == c)

因为了解这些情况需要一个实际的解析器。

现在,简单地说,您希望匹配=而不是==\+。因此:

if\([^=]\|==\+\)*[^=]=[^=]\([^=]\|==\+\)*$

它说的是什么:

  • if:匹配第一个if。
  • [^=]:除=
  • 之外的任何字符
  • ==\+=====
  • \([^=]\|==\+\)*:任何非======的内容。这包括所有空格,开头(,结尾)等。这是在孤立的=之前和之后。
  • [^=]=[^=]:已隔离=