我正在编写一个 AutoHotkey 脚本,它将根据屏幕上选择的文本格式化 SQL 语句。我想把这样的声明:
SELECT Name AS [Object Name], Switch([Type]=5,'Query',[Type]=-32768,'Form',[Type]=6,'Table') AS [Object Type], Switch([Type]=5,1,[Type]=-32768,2,[Type] In (1,4,6),6) AS [Object Type ID], Left(Name,4) as Prefix, LTrim(RTrim(Mid([Name],5,30))) as Suffix
进入这个:
SELECT Name AS [Object Name],
Switch([Type]=5,'Query',[Type]=-32768,'Form',[Type]=6,'Table') AS [Object Type],
Switch([Type]=5,1,[Type]=-32768,2,[Type] In (1,4,6),6) AS [Object Type ID],
Left(Name,4) as Prefix,
LTrim(RTrim(Mid([Name],5,30))) as Suffix
我首先将逗号替换为逗号+回车+制表符但是当我遇到包含在括号内使用逗号的函数的 SQL 语句时,它会产生不良结果。我的第一个解决方案是使用以下 AutoHotkey RegEx 命令排除括号内的逗号:
; Find commas not in parenthesis and suffix with <CR><Tab>
s := RegExReplace( s, ",(?![^()]*\))", ",`r`n" . Tab )
问题是有时括号是嵌套的,而简单的正则表达式不起作用。
经过一番挖掘后我found https://stackoverflow.com/a/43436342/1898524一个递归正则表达式,它将选择每组最外面的括号。
\((?:[^()]++|(?R))*\)
现在的挑战是,
- 我如何选择该组之外的所有内容并在其中查找/替换,or
- 如何仅将搜索/替换应用于该组中的文本?
正则表达式演示 https://regex101.com/r/5WMlyI/4/
SO 鼓励我们回答我们自己的问题。在写这篇文章的过程中,我找到了一个解决方案,我将在下面发布。欢迎分享您自己的解决方案。我想进一步加深对正则表达式的理解。