我想找到所有没有 dbo.
或 [dbo].
前缀的行(在 SQL 脚本中)(通常应显示为完全限定名称)。
例如,在以下文件中:
ALTER TABLE [dbo].[mo_scenario_em]
DROP CONSTRAINT [mo_scenario_em_scenario_id]
ALTER TABLE [team_assoc] -- <<< missing prefix
DROP CONSTRAINT [team_assoc_org_id]
ALTER TABLE dbo.asset_trans
DROP CONSTRAINT [DF__asset_tra__mod_f__5E90642B]
ALTER TABLE eq -- <<< missing prefix
DROP CONSTRAINT [DF__eq__source_recor__2498CCC0]
我希望我的命令显示第 3 行和第 7 行。
我的不工作对此的看法:
(defun show-missing-prefix ()
"Show lines where there is no `dbo.' or `[dbo.]' prefix."
(interactive)
(occur (concat "ALTER TABLE [^d][^b][^o]"
"\\|" "ALTER TABLE \\[[^d][^b][^o]\\]"
"\\|" "CREATE FUNCTION [^d][^b][^o]"
)))
它不起作用,因为我不知道如何使用 ALTER TABLE
来匹配行,但没有 dbo.
和 [dbo]。
.
问题是我不知道如何在正则表达式中编写“不是括号” -- [^\\[]
和 [^\\]]
不适用于 AFAICS。
当然,它必须推广到其他 SQL 关键字,例如:
- 改变程序
- 删除功能
- 删除表格
- 来自
- 插入
- 更新
并且不区分大小写,但是一旦骨架完成工作就应该没问题。
这可以通过非常简单的方式实现吗? (或者它是否已经以某种方式存在?)
最佳答案
正如 Drew、Triplee 和 jmg 所说:
不是括号,可以颠倒顺序:[^][]
不区分大小写show-missing-prefix
,如问题作者在下面的评论中发布的那样,缺少$
:
(defun show-missing-prefix ()
(interactive)
(occur "\\(alter\\|drop\\|insert\\) *\\(table\\) *\\(\\[?[^\\. ]+\\]?\\)$"))
解决问题的另一个建议,您可以从这样的事情开始:
query-replace-regexp
正则表达式匹配字符串:
\(alter\|drop\|insert\) *\(table\) *\(\[?[^. ]+\]?\)$
到字符串:
\1 \2 [dbo].\3)
使用转义的 ()
定义数字组,在替换字符串中引用:在本例中,\1
是操作(提供了 3 个),\2
是操作数(目前只有 table),\3
是命名对象,它指定一系列不包括 .
或 (空格)。
在您的示例中,删除缺少的前缀注释后,这会匹配第 3 行和第 7 行并添加前缀。
Emacs 附带了re-builder
,它允许您在构建正则表达式时获得实时反馈,但您必须确保使用正确的语法模式。 read
,默认模式,用于在编程中使用RE;因此,要在 re-builder
中看到上述正则表达式,您必须切换到 string
语法模式,该模式适用于交互使用的 RE。 (使用 C-c TAB
更改语法模式。)
还有很多其他软件包看起来可以提供帮助。 https://www.emacswiki.org/emacs/RegularExpression
此外,如果您想在找到成功后(以交互方式)获得命令的完整转义 lisp,请查看 command-history
:
(query-replace-regexp "\\(alter\\|drop\\|insert\\) *\\(table\\) *\\(\\[?[^\\. ]+\\]?\\)$" "\\1 \\2 [dbo].\\3" nil)
关于regex - 如何在 Emacs 正则表达式中表示 "not a bracket"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49154876/