【问题标题】:Difference between two seemingly similar regular expressions in MySQL - identical outputsMySQL中两个看似相似的正则表达式之间的区别 - 相同的输出
【发布时间】:2021-05-14 23:45:56
【问题描述】:

我一直在尝试自学 MySQL,想知道是否有人可以解释一下使用正则表达式元字符 '*' 和 '?' 之间的区别。我正在使用的书将它们描述为“匹配 (0) 或它前面的字符串的一个实例”。我尝试使用两者同时在我创建的练习表中寻找相同的东西并得到完全相同的输出,所以如果一个操作员应该是贪婪的而另一个不是,它看起来并不总是这样每张桌子。

编辑 1:我包含了我从 '*' that shows it matching a statement of the form 'ax*' to just a. 获得的输出的屏幕截图

编辑 2:regex101.com 没有将 MySQL 列为“风味”,当我尝试在那里对 Alexandra 执行 'al*' 时,它表示任何风味都不匹配。 MySQL Workbench 将 Alexandra 作为输出之一返回的事实是否是 MySQL 特有的,不适用于任何其他语言?

【问题讨论】:

  • 是时候离开这本书,试试regex101.com 的正则表达式了。他们有书面正则表达式的解释和每个部分含义的描述
  • 表达式"al*" 将匹配任何带有小写“a”的内容,这就是您的输出显示的内容。 "*" 仅适用于 l
  • @TimRoberts 我现在看到了!所以,它不是与“Alexandra”开头的“Al”匹配,而是与末尾的“a”匹配!

标签: mysql sql regex


【解决方案1】:

它们并不完全相同。 "*" 表示“0 或更多”。 "?" 表示“0 或 1”,如“可选”。所以,给定“ax*b”和“ax?b”:

  • 两者都不会匹配“a”
  • 两者都将匹配“ab”
  • 两者都将匹配“axb”
  • 只有第一个会匹配“axxb”或“axxxxxb”

【讨论】:

  • 那是印刷错误吗?此外,从我得到的输出看来,两者也只会匹配“a”。我查看了一个名称列表,并搜索了带有“Al*”和“Al?”的名称。两者都给了我只有 A 而没有 l 的名字,除了名字中同时有“Al”的顺序和相反的顺序。
  • 如果书上说"*"匹配0个或1个实例,那就错了。并且正则表达式"ax*b" 不会匹配唯一的字符串“a”。
  • 如果你想玩这个,试试像regex101.com这样的网站。您输入您的表达式和一些示例文本,它会向您显示结果。 (正如@astentx 已经建议的那样,我明白了。)
  • 在 Python 中,我同意你的看法。但我发现它确实发生在 MySQL 中。我不知道是不是 MySQL 特有的东西允许这种情况发生。
  • 您使用的是“rlike”?这应该需要对整个模式进行匹配。如果您有示例,可以将其添加到您的问题中。
猜你喜欢
  • 1970-01-01
  • 2019-02-26
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多