【问题标题】:RegEx - How to select all text in between backes (multiline)RegEx - 如何选择背面之间的所有文本(多行)
【发布时间】:2017-11-24 03:28:33
【问题描述】:

基本上,我想做的是解析一个*.sql 文件并选择所有CREATE TABLE 语句。示例如下:

-- ----------------------------
-- Table structure for aes_interval
-- ----------------------------
DROP TABLE IF EXISTS `aes_interval`;
CREATE TABLE `aes_interval`  (
  `processcode` bigint(20) NOT NULL,
  `overstaying` int(11) NOT NULL,
  `floating` int(11) NOT NULL,
  PRIMARY KEY (`processcode`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci;

通过运行将在(...) 之间全选的正则表达式,我将能够获得如下输出/子字符串文本:

CREATE TABLE `aes_interval`  (
  `processcode` bigint(20) NOT NULL,
  `overstaying` int(11) NOT NULL,
  `floating` int(11) NOT NULL,
  PRIMARY KEY (`processcode`) USING BTREE
)

我试过CREATE TABLE\w+\((.|\n)*?\) 但它只返回下面的输出:

CREATE TABLE `aes_interval`  (
  `processcode` bigint(20)

希望我能在这里找到正确的正则表达式。

【问题讨论】:

  • 你用什么来“解析”文件?赛德? grep?还有什么?

标签: sql regex string multiline


【解决方案1】:

假设CREATE TABLE 语句以分号结尾,因此分号直到每条语句的结尾才出现,那么下面的正则表达式应该可以工作:

(CREATE TABLE.*?;)

需要注意的是,上述内容需要在工具/语言中运行,点配置为匹配换行符。并且还需要启用多行匹配模式。

Demo

编辑:

我怀疑惰性点不适用于 Sublime Text。如果是这样,那么您可以尝试以下模式:

(CREATE TABLE[^;]*)

【讨论】:

  • Downvoter:如果他的 SQL 代码格式正确,我建议的模式应该可以工作。
  • 我检查了regex101 并确认它有效。但是,当我在 sublime text 3 上使用正则表达式时,它不会:(
  • @Nil 我更新了我的问题;请尝试第二种模式。
  • 现在可以使用了。谢谢您的帮助。我现在就在我的模块上试试。
【解决方案2】:

你可以在https://regex101.com/中试试这个(CREATE TABLE.*?((\(.*?\)).*?)+\))

【讨论】:

  • 这也有效,根据regex101。但是,与第一个答案不同(仅将其分解为 2 个匹配项)-您将这 2 个匹配项分解为 3 个子组。在尝试 tho 时也不适用于 sublime text 3 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 2019-08-29
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多