正则表达式只正确地拉第一次出现

曲轴

我正在尝试使用regexp提取数据库表的列定义,但似乎无法破解它:

这是我的表情:

(\".*?),\"

这是表数据的示例:

"tstamp" DATETIME NOT NULL  DEFAULT (datetime('now','localtime')) ,"macid" VARCHAR NOT NULL ,"id" INTEGER NOT NULL  DEFAULT (null) ,"info" VARCHAR,"temp" DOUBLE NOT NULL , "altemp" DOUBLE, "active" BOOL DEFAULT true, "emailts" INTEGER, "alarmts" INTEGER DEFAULT 0, "algrace" INTEGER DEFAULT 15, 'sid' VARCHAR, 'led' INTEGER DEFAULT 0, 'sends' INTEGER DEFAULT 0, PRIMARY KEY ("macid","id")

这就是我所追求的:

"tstamp" DATETIME NOT NULL  DEFAULT (datetime('now','localtime'))
"macid" VARCHAR NOT NULL
"id" INTEGER NOT NULL  DEFAULT (null)
...

但是我得到的是:

"tstamp" DATETIME NOT NULL  DEFAULT (datetime('now','localtime'))
" VARCHAR NOT NULL
" INTEGER NOT NULL  DEFAULT (null)
...

似乎是在忽略开始条件,只有第一个匹配是正确的。

我究竟做错了什么 ?

在线正则表达式

http://regex101.com/r/aJ2uW5

zx81

在我看来,您需要这样的东西:

['"].*?(?=,\s*(?![^)(]*\))['"]|$)

regex101上的演示

我们匹配一个开头的引号,然后将所有内容懒惰地匹配.*?到一个点,在此点之前,我们(?=,\s*(?![^)(]*\))['"]|$)可以断言以下字符要么是逗号,然后是可选空格(后跟任意数量的非括号字符,后跟一个右括号)和右引号,或者字符串的结尾($锚点)。

这是一口吗?

是的。下面的可视化和按令牌逐个演练为您提供了更多详细信息,但是在我看来,没有什么替代方法可以在功能齐全的regex工具中构建这样的表达式。这样,您就可以在创建表达式时实时看到匹配的变化。

原件有什么问题?

您的比赛实际上吃了以下逗号和开头的引号:,\"因此,在第一次比赛之后,引擎与字符串不同步。

逐令牌解释

  • 匹配列表“'”中的单个字符 ['"]
  • 匹配不是换行符的任何单个字符(换行符) .*?
    • 在0到无限制的时间之间,尽可能少的时间,根据需要扩展(延迟) *?
  • 断言以下正则表达式可以从该位置开始匹配(正向超前) (?=,\s*(?![^)(]*\))['"]|$)
    • 匹配此替代方案(仅在此替代方案失败时尝试下一个替代方案) ,\s*(?![^)(]*\))['"]
      • 从字面上匹配字符“,” ,
      • 匹配单个字符,即“空白字符”(ASCII空格,制表符,换行符,回车符,垂直制表符,换页符) \s*
        • 在0到无限制的时间之间,尽可能地多次,并根据需要进行回馈(贪婪) *
      • 断言从此位置开始,不可能匹配下面的正则表达式(负超前) (?![^)(]*\))
        • 匹配列表“)(”中不存在的任何单个字符 [^)(]*
          • 在0到无限制的时间之间,尽可能地多次,并根据需要进行回馈(贪婪) *
        • 从字面上匹配字符“)” \)
      • 匹配列表“'”中的单个字符 ['"]
    • 或匹配此替代方法(如果该组不匹配,则整个组都将失败) $
      • 在字符串末尾或换行符之前在字符串末尾声明位置(如果有的话)(换行) $

正则表达式可视化

Debuggex演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正则表达式只捕获括号内的第一次出现

来自分类Dev

正则表达式:先行捕获第一次出现

来自分类Dev

正则表达式。驼色表壳彰显个性。忽略第一次出现

来自分类Dev

希望正则表达式在第一次出现“”时停止。和“;”

来自分类Dev

正则表达式,仅替换第一次出现的HTML标签

来自分类Dev

正则表达式。驼色表壳彰显个性。忽略第一次出现

来自分类Dev

仅在第一次出现之前获得正则表达式匹配结果

来自分类Dev

如何获得第一次出现?正则表达式python

来自分类Dev

正则表达式全局替换不替换第一次出现

来自分类Dev

正则表达式直到第一次出现括号关闭

来自分类Dev

正则表达式第一次出现在单词之前

来自分类Dev

正则表达式 - 获得第一次出现

来自分类Dev

正则表达式用括号第一次出现

来自分类Dev

正则表达式:匹配以某些字符开头的单词的第一次出现

来自分类Dev

正则表达式:匹配第一次出现的:

来自分类Dev

正则表达式,帮助我只在字符串中第一次出现,避免在某些字符 Vb.Net 之后搜索

来自分类Dev

用于获得第一次唯一出现的正则表达式

来自分类Dev

正则表达式不匹配我的字符串的第一次出现

来自分类Dev

如何使用正则表达式仅匹配每行中第一次出现的字符串

来自分类Dev

正则表达式仅过滤特定字符串的第一次出现

来自分类Dev

Grep正则表达式在第一次比赛后停止

来自分类Dev

正则表达式在第一次比赛后停止

来自分类Dev

正则表达式 - 在第一次匹配之前删除所有内容

来自分类Dev

正则表达式只匹配从左到右的最后一次出现

来自分类Dev

最后只出现一次“%”的接受数字的正则表达式

来自分类Dev

正则表达式匹配第一次出现以及直到最后一场比赛之间的所有内容

来自分类Dev

Python正则表达式。我正在尝试在某个单词之后的任何单词的第一次出现时删除文本(Total_Cases)

来自分类Dev

如何找到从字符串中某个位置开始的正则表达式第一次出现的索引?

来自分类Dev

正则表达式向后匹配任何字符串,直到第一次出现字符串

Related 相关文章

  1. 1

    正则表达式只捕获括号内的第一次出现

  2. 2

    正则表达式:先行捕获第一次出现

  3. 3

    正则表达式。驼色表壳彰显个性。忽略第一次出现

  4. 4

    希望正则表达式在第一次出现“”时停止。和“;”

  5. 5

    正则表达式,仅替换第一次出现的HTML标签

  6. 6

    正则表达式。驼色表壳彰显个性。忽略第一次出现

  7. 7

    仅在第一次出现之前获得正则表达式匹配结果

  8. 8

    如何获得第一次出现?正则表达式python

  9. 9

    正则表达式全局替换不替换第一次出现

  10. 10

    正则表达式直到第一次出现括号关闭

  11. 11

    正则表达式第一次出现在单词之前

  12. 12

    正则表达式 - 获得第一次出现

  13. 13

    正则表达式用括号第一次出现

  14. 14

    正则表达式:匹配以某些字符开头的单词的第一次出现

  15. 15

    正则表达式:匹配第一次出现的:

  16. 16

    正则表达式,帮助我只在字符串中第一次出现,避免在某些字符 Vb.Net 之后搜索

  17. 17

    用于获得第一次唯一出现的正则表达式

  18. 18

    正则表达式不匹配我的字符串的第一次出现

  19. 19

    如何使用正则表达式仅匹配每行中第一次出现的字符串

  20. 20

    正则表达式仅过滤特定字符串的第一次出现

  21. 21

    Grep正则表达式在第一次比赛后停止

  22. 22

    正则表达式在第一次比赛后停止

  23. 23

    正则表达式 - 在第一次匹配之前删除所有内容

  24. 24

    正则表达式只匹配从左到右的最后一次出现

  25. 25

    最后只出现一次“%”的接受数字的正则表达式

  26. 26

    正则表达式匹配第一次出现以及直到最后一场比赛之间的所有内容

  27. 27

    Python正则表达式。我正在尝试在某个单词之后的任何单词的第一次出现时删除文本(Total_Cases)

  28. 28

    如何找到从字符串中某个位置开始的正则表达式第一次出现的索引?

  29. 29

    正则表达式向后匹配任何字符串,直到第一次出现字符串

热门标签

归档