【问题标题】:Match a For Loop Using a Regex使用正则表达式匹配 For 循环
【发布时间】:2021-03-18 10:40:48
【问题描述】:

我想将下面的 Code 与我的 Regex 匹配, 简单地说,我想匹配从for 开始并以} 结束的整个for loop 语句。

这是我尝试过的,但在我的方法中,我必须给\Rfor loop 中的行数完全相同的时间,它可以是动态的吗?或者有没有更好的解决方案。 请告诉我

这是我的 Regex

代码
for.+\(.*\R.*\R.*\R.*\R.*\R.*\R.*

这就是我想要匹配的

  for (i = 2; i <= n / 2; ++i) {
    // condition for non-prime
    if (n % i == 0) {
      flag = 1;
      break;
    }
  }

【问题讨论】:

  • 使用解析器可能是更好的解决方案。
  • 我想用正则表达式来做,你能帮我吗?而且我不知道您在说哪个解析器,它与网络抓取有关吗?
  • 您使用什么语言或正则表达式库?
  • 您需要一个将换行符视为空格的库..
  • 真正的正则表达式无法计数,例如匹配大括号对以查找函数上关闭的} 超出了他们的能力范围。一些“正则表达式”引擎实际上远远超出了真正的正则表达式所能做的,所以它可能是可能的。见this question

标签: regex bash sed grep


【解决方案1】:

这是一个使用 AWK 的示例 - 它使用 Regex 进行匹配,并使用一些逻辑进行 { in 和 } out 处理。

awk 'BEGIN { infor=0; }
/for *\(.*{/ { infor++; print $0; next; }
/^.*$/ { if (infor) { print $0; } }
/{/ { if (infor) { infor++; } }
/}/ { if (infor) { infor--; } }'

鉴于此输入 -

What the AWK man

for (i = 2; i <= n / 2; ++i) {
    // condition for non-prime
    if (n % i == 0) {
      flag = 1;
      break;
    }
  }

echo ME
Echo you

  for (i = 2; i <= n / 2; ++i) {
      // condition for non-prime
      if (n % i == 0) {
        flag = 1;
        break;
      }
    }

它只给出了 for 循环的输出。

for (i = 2; i <= n / 2; ++i) {
    // condition for non-prime
    if (n % i == 0) {
      flag = 1;
      break;
    }
  }
  for (i = 2; i <= n / 2; ++i) {
      // condition for non-prime
      if (n % i == 0) {
        flag = 1;
        break;
      }
    }

【讨论】:

    【解决方案2】:

    你可以试试这个正则表达式:

    #!/usr/bin/env bash
    
    grep -z -Po '(?s)[ \t]*for [^{]+{[^{}]+condition for non-prime[^}]+}[^}]+}' << EOF
      for (i = 2; i <= n / 2; ++i) {
        // Different comment
        if (n % i == 0) {
          flag = 1;
          break;
        }
      }
      for (i = 2; i <= n / 2; ++i) {
        // condition for non-prime
        if (n % i == 0) {
          flag = 1;
          break;
        }
      }
    other stuff
    

    【讨论】:

      【解决方案3】:

      您要求的一个问题是大括号不匹配的可能性(在 cmets 或字符串中):

      // This comment line will break the search of matching } pairs
      print "And a message with a single } fails too."
      

      当代码缩进良好时(可能是您的 IDE 中的一些代码格式化工具),您可以尝试使用缩进的解决方案:

      sed -rz 's/.*(^|\n)(\s*)(for[^\n]*\n)((\2[^}][^\n]*\n)*[^\n]*).*/\2\3\4\n/' inputfile
      

      对于空行的循环,这将失败,并且只会从文件中提取最后一个循环。我不会解释命令,使用正则表达式来完成你的任务太复杂了。

      当您知道缩进使用了多少空格(为制表符重写下一个命令)时,您可以尝试选择不带或带 2 个空格缩进的 for 循环。

      sed -n '/^  for/,/^  }/ p; /^for/,/}/ p' inputfile
      

      这都是猜测,在现实生活中会失败。请考虑一下为什么要提取 for 循环并考虑编写一个能够理解语法的解析器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-11
        • 2012-10-03
        • 2012-10-01
        • 1970-01-01
        • 2020-06-20
        • 1970-01-01
        相关资源
        最近更新 更多