【问题标题】:Notepad++ macro to replace in VB scripts variable assignments by the value of each assigned variableNotepad++ 宏用每个分配变量的值替换 VB 脚本中的变量分配
【发布时间】:2014-06-14 14:10:19
【问题描述】:

我有许多带有许多变量的 VB 脚本文件,我想用宏的值替换所有变量。

例如:

label1.text = "Fan"
label2.text = "Close"
label3.text = "Open"
ledfan.tag = label1.text
led2.tag = label2.text
led3.tag = label3.text

进入:

ledfan = "Fan"
led2 = "Close"
led3 = "Open"

我尝试使用宏来做到这一点,但我遇到的问题是命令 Ctrl+C 没有记录到宏中。 我也尝试过使用正则表达式,但似乎找不到正确的公式。

谢谢! :)

【问题讨论】:

  • 您可能希望将文件一分为二,然后查看this post

标签: regex macros notepad++


【解决方案1】:

我没有使用文本编辑器 Notepad++,因为我使用的是文本编辑器 UltraEdit

此任务的 UltraEdit 宏解决方案是:

InsertMode
ColumnModeOff
HexOff
Top
PerlReOn
Loop 0
Find MatchCase RegExp "^[ \t]*(\w+\.text)[ \t]*=[ \t]*("[^\r\n]+)\r?\n([\s\S]+?)\.tag([ \t]*=[ \t]*)\1"
Replace All "\3\4\2"
IfNotFound
ExitLoop
EndIf
EndLoop

我解释了 Perl 正则表达式 Replace All 在循环中对整个文件内容执行,直到没有东西可以被替换。这个 Perl 正则表达式 Replace All 应该也可以在 Notepad++ 中使用。

^ ...从行首开始每次搜索。

[ \t]* ... 0 个或多个空格或制表符可以在行首。

\w+ ... 查找包含 1 个或多个单词字符的字符串,这些字符是字母、数字和字符下划线。

\.text ... 下一个固定字符串 .text 必须在该行中。

\w+\.text 周围的左括号和右括号标记/捕获此表达式找到的字符串以进行反向引用。这部分找到的字符串在搜索字符串本身中被反向引用为\1

[ \t]*=[ \t]* ... 接下来可以有 0 个或多个空格或制表符,然后必须找到等号,然后再找到 0 个或多个空格或制表符。

("[^\r\n]+) ... 查找以双引号开头并在行尾结束的字符串,该字符串也被捕获用于反向引用。此表达式匹配文本值和注释(如果存在)。这部分找到的字符串在替换字符串中被反向引用为\2

\r?\n ...如果存在回车并且匹配换行符,则下一个回车。

直到\n 的表达式匹配文本定义行。

([\s\S]+?) ... 一个非贪婪表达式匹配任何直到表达式的下一部分返回肯定结果的位置。此表达式匹配从具有文本值定义的当前行下方的行首到匹配标记值变量的名称结尾的所有内容。例如,在第一次运行 label1.text 时,此表达式匹配从 label2.textledfan 的所有内容。此块也被捕获用于在用\3 替换字符串中进行反向引用。

\.tag ...接下来必须找到固定字符串.tag

([ \t]*=[ \t]*) ...接下来可以有 0 个或多个空格或制表符,然后必须找到等号,然后再找到 0 个或多个空格或制表符。找到的字符串的这一部分被捕获以在替换字符串中使用\4 进行反向引用。

\1……文本值变量的名字也一定要找到。


我必须补充一点,这个宏分别是 Perl 正则表达式 Replace All 在循环中执行,直到没有东西可以被替换,只有当每个文本值只分配一次给变量时才有效。如果将像 label2.text 这样的文本值分配给变量两次,则此解决方案将不起作用。

UltraEdit 宏解决方案也适用于将文本值多次分配给变量:

InsertMode
ColumnModeOff
HexOff
Top
UltraEditReOn
Clipboard 9
Loop 0
Find MatchCase RegExp "%[^t ]++[0-9A-Za-z_]+.text[^t ]++=[^t ]++""
IfNotFound
ExitLoop
EndIf
Key LEFT ARROW
Find MatchCase RegExp ""*$"
Copy
Key HOME
Find MatchCase RegExp "[0-9A-Za-z_]+.text"
Find MatchCase RegExp ".tag^([^t ]++=[^t ]++^)^s"
Replace All "^1^c"
DeleteLine
EndLoop
ClearClipboard
Clipboard 0

但是这个宏在 UltraEdit 正则表达式中使用用户剪贴板 9 的内容 (^c) 和当前选定的文本 (^s) 替换所有支持的其他正则表达式引擎(Unix 和 Perl)无法完成UltraEdit

此解决方案的另一个优点是删除了定义文本值的行,该文本值未分配给以下代码中的任何其他变量。所以这个宏也会清理未使用的文本值。

我不知道如何在 Notepad++ 宏中使用此方法,因为我没有使用 Notepad++


第一个解决方案仅使用 Perl 正则表达式 Replace All 将一个文本变量分配给另一个变量,也可以使用 Replace in Files 命令执行它以在 a 的所有文件上运行它目录(树),当然也在循环中,直到任何文件中的任何内容都不能被替换。


UltraEdit 宏,用于请求更改评论的下一个任务

txtOssigeno.temp = GetStringResource(167)
txtFotoresistenza.temp = GetStringResource(174)
Me.txtOssigeno.Caption = Prot00026
Me.txtFotoresistenza.Caption =Prot00006

进入

GetStringResource(167) = Prot00026
GetStringResource(174) = Prot00006

使用 Perl 正则表达式引擎:

InsertMode
ColumnModeOff
HexOff
Top
PerlReOn
Loop 0
Find MatchCase RegExp "^[ \t]*(\w+)\.temp[ \t]*=[ \t]*([\w()]+)[^\r\n]*?\r?\n([\s\S]+?)Me\.\1\.Caption[ \t]*=[ \t]*"
Replace All "\3\2 = "
IfNotFound
ExitLoop
EndIf
EndLoop

和 UltraEdit 正则表达式引擎:

InsertMode
ColumnModeOff
HexOff
Top
UltraEditReOn
Clipboard 9
Loop 0
Find MatchCase RegExp "%[^t ]++[0-9A-Za-z_]+.temp[^t ]++="
IfNotFound
ExitLoop
EndIf
Find MatchCase RegExp "[0-9A-Za-z_()]+"
Copy
Key HOME
Find MatchCase RegExp "[0-9A-Za-z_]+"
Find MatchCase RegExp "Me.^s.Caption[^t ]++=[^t ]++"
Replace All "^c = "
DeleteLine
EndLoop
ClearClipboard
Clipboard 0

由您决定使用 2 个宏中的哪一个。

【讨论】:

  • 完美...现在我想更改变量示例:
  • 完美... 现在我想更改变量示例: =Prot00006 ` into: ` GetStringResource(167) = Prot00026 GetStringResource(174) = Prot00006 ` 我尝试 Find ^[ \t]*(\w+)\.temp[ \t]*=[ \t]*(GetStringResource[^\r\n]+)\r?\n([\s\S]+?)\Me.\1.Caption 和 Replce \2 但不起作用这是怎么回事?
  • 您的正则表达式也适用于查找部分。错误出现在替换字符串中,因为您需要使用表达式 \3\2 来保持要删除的行和要更新的行之间的行。我还为这项新任务使用了 2 个新宏更新了我的答案。
【解决方案2】:

在 Notepad++ 中,您可以一次对一个变量执行此操作。如果重复运行替换,则可以执行所有行。也许你可以用宏来做到这一点。

这是一个适用于一个变量(一对行)的正则表达式:

搜索:(?sm)^(\w+)\.[^=]*(=.*?[\r\n]+)(.*)^(\w+)\.tag[^=]*=\s*\1[^\r\n]*

替换:\3\4\2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-07
    • 2013-09-05
    • 1970-01-01
    • 2011-11-29
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多