【问题标题】:Regular expression to find accidental assignments in a conditional statement在条件语句中查找意外赋值的正则表达式
【发布时间】:2012-12-09 22:22:48
【问题描述】:

我不止一次被一个错误所困扰,您不小心在条件语句中分配了一个变量,例如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]*\) 可以很好地处理简单的情况,但如果在示例底部想出一些适用于扩展版本的东西会很好。

有更好的表达方式吗?

【问题讨论】:

  • 我正在尝试匹配if
  • @sputnick 正则表达式有一个 if:(?(ifregex)thenregex|elseregex)
  • 您还需要捕获任何其他条件,它们都是潜在的分配。除非您正在解析标记化,否则可能无法捕获所有内容。
  • 您可以检查整行是否同时包含 if== - 假设块是换行的

标签: regex language-agnostic


【解决方案1】:

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

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

【讨论】:

  • 嘿,谢谢你的链接,我会看看其中的一些工具。我一直在寻找快速而肮脏的东西,但是一旦其中一个工具启动并运行,它应该会提供更准确的结果。
【解决方案2】:

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

if ((a = b) == c)

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

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

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

它是怎么说的:

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

【讨论】:

  • 太棒了。我在我的项目上尝试过,但没有找到任何东西。所以我想这意味着我这次写了很好的代码。哈!干杯!
  • @akatakritos,我不是 php 开发人员,但我希望任何编译器/解释器读取该代码都会给你警告,不是吗?
  • 意外分配,AFAIK 不是 PHP 中的任何警告。我想念 C#,它是一个编译错误。 :(
猜你喜欢
  • 2011-12-13
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 2023-02-13
  • 2019-03-10
  • 2011-02-07
  • 2022-11-12
  • 1970-01-01
相关资源
最近更新 更多