我没有使用文本编辑器 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.text 到 ledfan 的所有内容。此块也被捕获用于在用\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 个宏中的哪一个。