- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找一个正则表达式来匹配对可变参数 c 函数的所有潜在多行调用。最终目标是打印文件、行号和每次调用的第四个参数,但不幸的是我还没有。到目前为止,我有这个:
perl -ne 'print if s/^.*?(func1\s*\(([^\)\(,]+||,|\((?2)\))*\)).*?$/$1/s' test.c
与测试.c:
int main() {
func1( a, b, c, d);
func1( a, b,
c, d);
func1( func2(), b, c, d, e );
func1( func2(a), b, c, d, e );
return 1;
}
-- 与第二个调用不匹配。它不匹配的原因是表达式末尾的 s
允许 .
匹配换行符,但似乎不允许 [.. ]
构造以匹配换行符。我不确定如何克服这个问题。
我也不确定如何引用这里的第四个参数......我想我会因为正则表达式的递归性质而遇到一些问题。
最佳答案
这应该捕获你的功能,但要注意
perl -0777 -wnE'@f = /(func1\s*\( [^;]* \))\s*;/xg; s/\s+/ /g, say for @f' tt.c
我使用了语句必须由 ;
终止的事实。然后这排除了注释中的意外 ;
并且排除了对嵌套在另一个调用中的调用。如果这是可能的,那么需要做更多的工作来解析它。
但是,进一步解析捕获的调用(大概是用逗号)很复杂,因为嵌套调用很可能而且实际上包含逗号。怎么样
func1( a, b, f2(a2, b2), c, f3(a3, b3), d );
这变成了一个更有趣的小解析问题。或者,宏怎么样?
您能否阐明哪些事情是不需要考虑的?
由于提到的注意事项可能会被忽略,这里有一种解析参数列表的方法,使用 Text::Balanced .
由于我们需要提取作为参数出现的整个函数调用,例如 f(a, b)
,因此库中最合适的函数是 extract_tagged
。有了它,我们可以使开始标记成为单词左括号 (\w+\(
),结束标记成为右括号 \)
。
此函数仅提取第一次出现,因此它被包装在 extract_multiple
use warnings;
use strict;
use feature 'say';
use Text::Balanced qw(extract_multiple extract_tagged);
use Path::Tiny; # path(). for slurp
my $file = shift // die "Usage: $0 file-to-parse\n";
my @functions = path($file)->slurp =~ /( func1\( [^;]* \) );/xg;
s/\s+/ /g for @functions;
for my $func (@functions) {
my ($args) = $func =~ /func1\s*\(\s* (.*) \s*\)/x;
say $args;
my @parts = extract_multiple( $args, [ sub {
extract_tagged($args, '\\w+\\(', '\\\)', '.*?(?=\w+\()')
} ] );
my @arguments = grep { /\S/ } map { /\(/ ? $_ : split /\s*,\s*/ } @parts;
s/^\s*|\s*\z//g for @arguments;
say "\t$_" for @arguments;
}
extract_multiple
仅返回带有(嵌套)函数调用的部分(可通过括号来识别),它们是原样的参数,也是我们用所有这些寻找的内容,部分是带逗号的字符串- 其他参数的分隔组,被分成单独的参数。
注意 extract_tagged
中的转义量(通过反复试验发现)!这是必需的,因为这些字符串在 string-eval
中被两次用双引号引起来。这根本没有记录,所以请参阅 the source (例如 here )。
或者直接生成急需转义的字符(\x5C
for \
),这样就不需要转义了
extract_tagged($_[0], "\x5C".'w+'."\x5C(", '\x5C)', '.*?(?=\w+\()')
我不知道我会称之为“更清晰”
我测试了问题中提供的文件,并在其中添加了一个函数
func1( a, b, f2(a2, f3(a3, b3), b2), c, f4(a4, b4), d, e );
对于每个函数,程序打印带有要解析的参数列表的字符串和已解析的参数,输出中最有趣的部分是上述(添加的)函数
[ ... ]a, b, f2(a2, f3(a3, b3), b2), c, f4(a4, b4), d, e a b f2(a2, f3(a3, b3), b2) c f4(a4, b4) d e
关于regex - 用于匹配对 c 函数的多行调用的 perl 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73376526/
为了让我的代码几乎完全用 Jquery 编写,我想用 Jquery 重写 AJAX 调用。 这是从网页到 Tomcat servlet 的调用。 我目前情况的类似代码: var http = new
我想使用 JNI 从 Java 调用 C 函数。在 C 函数中,我想创建一个 JVM 并调用一些 Java 对象。当我尝试创建 JVM 时,JNI_CreateJavaVM 返回 -1。 所以,我想知
环顾四周,我发现从 HTML 调用 Javascript 函数的最佳方法是将函数本身放在 HTML 中,而不是外部 Javascript 文件。所以我一直在网上四处寻找,找到了一些简短的教程,我可以根
我有这个组件: import {Component} from 'angular2/core'; import {UserServices} from '../services/UserService
我正在尝试用 C 实现一个简单的 OpenSSL 客户端/服务器模型,并且对 BIO_* 调用的使用感到好奇,与原始 SSL_* 调用相比,它允许一些不错的功能。 我对此比较陌生,所以我可能会完全错误
我正在处理有关异步调用的难题: 一个 JQuery 函数在用户点击时执行,然后调用一个 php 文件来检查用户输入是否与数据库中已有的信息重叠。如果是这样,则应提示用户确认是否要继续或取消,如果他单击
我有以下类(class)。 public Task { public static Task getInstance(String taskName) { return new
嘿,我正在构建一个小游戏,我正在通过制作一个数字 vector 来创建关卡,该数字 vector 通过枚举与 1-4 种颜色相关联。问题是循环(在 Simon::loadChallenge 中)我将颜
我有一个java spring boot api(数据接收器),客户端调用它来保存一些数据。一旦我完成了数据的持久化,我想进行另一个 api 调用(应该处理持久化的数据 - 数据聚合器),它应该自行异
首先,这涉及桌面应用程序而不是 ASP .Net 应用程序。 我已经为我的项目添加了一个 Web 引用,并构建了各种数据对象,例如 PayerInfo、Address 和 CreditCard。但问题
我如何告诉 FAKE 编译 .fs文件使用 fsc ? 解释如何传递参数的奖励积分,如 -a和 -target:dll . 编辑:我应该澄清一下,我正在尝试在没有 MSBuild/xbuild/.sl
我使用下划线模板配置了一个简单的主干模型和 View 。两个单独的 API 使用完全相同的配置。 API 1 按预期工作。 要重现该问题,请注释掉 API 1 的 URL,并取消注释 API 2 的
我不确定什么是更好的做法或更现实的做法。我希望从头开始创建目录系统,但不确定最佳方法是什么。 我想我在需要显示信息时使用对象,例如 info.php?id=100。有这样的代码用于显示 Game.cl
from datetime import timedelta class A: def __abs__(self): return -self class B1(A):
我在操作此生命游戏示例代码中的数组时遇到问题。 情况: “生命游戏”是约翰·康威发明的一种细胞自动化技术。它由一个细胞网格组成,这些细胞可以根据数学规则生存/死亡/繁殖。该网格中的活细胞和死细胞通过
如果我像这样调用 read() 来读取文件: unsigned char buf[512]; memset(buf, 0, sizeof(unsigned char) * 512); int fd;
我用 C 编写了一个简单的服务器,并希望调用它的功能与调用其他 C 守护程序的功能相同(例如使用 ./ftpd start 调用它并使用 ./ftpd stop 关闭该实例)。显然我遇到的问题是我不知
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
我希望能够从 cmd 在我的 Windows 10 计算机上调用 python3。 我已重新安装 Python3.7 以确保选择“添加到路径”选项,但仍无法调用 python3 并使 CMD 启动 P
我是一名优秀的程序员,十分优秀!