regex - 如何在 Emacs 正则表达式中表示 "not a bracket"?

标签 regex emacs regex-negation

我想找到所有没有 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://emacs.stackexchange.com/questions/5568/why-do-regular-expressions-created-with-the-regex-builder-use-syntax-different-f

还有很多其他软件包看起来可以提供帮助。 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/

相关文章:

emacs - 没有 INITVALUE 的 defvar

emacs - 在 Emacs 中删除当前(非原子)s 表达式

regex - 无论如何,我是否可以避免将以下规则中的 9 位数字与我拥有的正则表达式相匹配?

c# - 用于验证算术表达式的正则表达式

c++ - 正则表达式从大括号构建 vector

javascript - Jquery 验证不适用于特殊字符

python - 正则表达式包括具有相同开始的重叠匹配

python - Emacs:即使安装了 `jedi:install-server`, `virtualenv` 也会失败

regex - 使用正则表达式进行负向预测,以排除 Google Analytics 和 Google Search Console 中包含特定单词的短语

regex - 除了三个字符 : |, ^ 和 ~(竖线、插入符号和波形符)之外,接受任何内容的最短正则表达式是什么?