用自定义函数替换 Print 语句调用

Posted

技术标签:

【中文标题】用自定义函数替换 Print 语句调用【英文标题】:Replace Print statement calls with a custom function 【发布时间】:2019-07-21 01:48:52 【问题描述】:

有一个旧版 VB6 应用程序使用 Print 语句在整个应用程序中写入日志。 Print 的出现次数超过 2 万次。我想在每个Print 调用上写一些更多的日志信息。

可以通过用我自己的函数替换Print 调用来实现。这对未来也有帮助。

有些语句是这样的:

Print #FileNo, Tab(1); "My Text Here";
Print #FileNo, Tab(col); Txt;
Print #FileNo, Tab(100); Format(TheDate, "DDMMMYYYY") & "    " & Variable_Name & "Field : " & Format(Field, "x")
Print #FileNo, Tab(1); Format(TheDate, "x") & " - " & TheName;
Print #FileNo, String(132, "-")
Print #FileNo, Tab(6); "SOME VALUE"; "SOME MORE VALUES";

这里; 指示打印语句不要更改行,Tab 指示将插入点定位到绝对列号。

问题:如何在保留Tabsemicolon 的行为的同时用我自己的函数替换Print

【问题讨论】:

打印和绘图函数是 Basic 的保留,并且在编译器中包含特殊处理,因此您不能简单地交换语句。您需要使用正则表达式搜索源代码以匹配打印并替换为调用您自己的函数。用, 替换裸; 字符以接收它们作为参数,paramarray 将允许您需要的可变数量。 @AlexK。我期望相同,所以我尝试使用正则表达式选项通过 Notepad++ 替换此类语句,但无法创建匹配的正则表达式来替换。 @bjan 你可以从Print #\w+, (?:[^;\r\n]+;?)+之类的东西开始 我建议您编辑问题以添加 [regex] 和 [notepad++] 标签 and 至少采用一个示例输入并提供所需输出的示例。您可能会以这种方式获得正则表达式解决方案(如果您只使用编辑器,我认为需要分两步完成)。 @AhmedAbdelhameed 谢谢 【参考方案1】:

你应该让你的函数期待一个ParamArray参数as suggested by Alex,而不是把一个调用分解成多个调用。您的函数应如下所示:

' Remember to set the return type or change the function to a Sub.
Public Function MyPrint(fileNo As Byte, ParamArray text() As Variant) 'As SomeType
    ' Insert body here.
End Function

现在,让我们谈谈正则表达式。要仅使用 NotePad++,我相信您需要分两步完成。

    要替换方法名称(PrintMyPrint),请使用以下模式:

    Print\h+(#\w+)
    

    并替换为:

    MyPrint \1
    

    Demo.

    要将分号替换为逗号,可以使用以下模式:

    (?:MyPrint #\w+\K,\h*|(?!^)\G\h*)([^;\r\n]+);?
    

    并替换为:

    , \1
    

    Demo.

示例输入:

Print #FileNo, Tab(1); "My Text Here";
Print #FileNo, Tab(col); Txt;
Print #FileNo, Tab(100); Format(TheDate, "DDMMMYYYY") & "    " & Variable_Name & "Field : " & Format(Field, "x")
Print #FileNo, Tab(1); Format(TheDate, "x") & " - " & TheName;
Print #FileNo, String(132, "-")
Print #FileNo, Tab(6); "SOME VALUE"; "SOME MORE VALUES";

Print #FileNo, Tab(100); "First Text"; "Second Text"
Print #FileNo, "Third Text"; "Fourth Text"

最终输出:

MyPrint #FileNo, Tab(1), "My Text Here"
MyPrint #FileNo, Tab(col), Txt
MyPrint #FileNo, Tab(100), Format(TheDate, "DDMMMYYYY") & "    " & Variable_Name & "Field : " & Format(Field, "x")
MyPrint #FileNo, Tab(1), Format(TheDate, "x") & " - " & TheName
MyPrint #FileNo, String(132, "-")
MyPrint #FileNo, Tab(6), "SOME VALUE", "SOME MORE VALUES"

MyPrint #FileNo, Tab(100), "First Text", "Second Text"
MyPrint #FileNo, "Third Text", "Fourth Text"

【讨论】:

这个答案对于使用 Notepad++ 用正则表达式替换文本来说是一个很大的帮助。这也让我偏离了原来的问题,所以我删除了 Edit 1 和 Edit 2

以上是关于用自定义函数替换 Print 语句调用的主要内容,如果未能解决你的问题,请参考以下文章

python怎样用自定义函数对列表排序?

MySQL巧用自定义函数进行查询优化

Python调用自定义模块方法有啥

我们可以用自定义函数扩展现有的类吗? (无继承)

用自定义视图替换字符串

如果用自定义子类替换默认视图,cornerRadius 不起作用