正则表达式 - 求一个vim中的正则
天蓬老师
天蓬老师 2017-05-16 16:40:06
[PhpStudy讨论组]

原始文本简化如下(好几个建表语句,有些表中有相同的字段):

CREATE TABLE `test1` (
  `field1` int,
) ENGINE=InnoDB

CREATE TABLE `test2` (
  `field1` int,
) ENGINE=InnoDB

CREATE TABLE `test3` (
  `field2` int,
) ENGINE=InnoDB

CREATE TABLE `test4` (
  `field3` int,
) ENGINE=InnoDB

CREATE TABLE `test5` (
  `field2` int,
) ENGINE=InnoDB

我需要把表中有field2字段的建表语句选出来,也就是把下面的文本选出来

CREATE TABLE `test3` (
  `field2` int,
) ENGINE=InnoDB

CREATE TABLE `test5` (
  `field2` int,
) ENGINE=InnoDB

想到了一个正则CREATE\_.\{-}F_class_type\_.\{-}ENGINE,但这个显然有问题。

怎样加限制条件使选出的文本中只有一个CREATE,这样选出的就是正确的了。谢谢。


自己又查了查,使用否定环视就可以了。

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(3)
ringa_lee

又查了一下正则,使用否定环视就能解决这个问题。
先贴正确的正则:\vCREATE(\_.(CREATE)@!){-}field2\_.{-}ENGINE.*

解释一下,也方便以后自己查看
\v:任何元字符都不用加反斜杠
\_.:包括换行符的所有字符
(CREATE)@!:顺序否定环视
(\_.(CREATE)@!){-}:非贪婪匹配任意字符,并且匹配出的结果中不含有CREATE字符串

使用否定环视后就能保证匹配出的结果只有一个CREATE字符串,也就是匹配结果不会有多条建表的语句

漂亮男人

另外的思路: 用 应该也可以

 :vim some.sql
 /field2
 qa{V}:w! >> wanted.sql
 nq
 99@a
  • 前提是每个创建语句行间不能有空行,首尾要有空行, 参见 :h {
  • 99@a 中的99 可以通过 %/field2//n 获取
世界只因有你

随手写了一个,在sublime中测试通过。供参考:

CREATE TABLE .*\s.*`field2`[\s\S]*?ENGINE=InnoDB

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号