【问题标题】:Regex for strings formed from a given set of characters由给定字符集形成的字符串的正则表达式
【发布时间】:2015-12-09 14:31:15
【问题描述】:

对于给定的字符集,匹配由给定字符集中的一个或多个字符精确形成的所有字符串的正则表达式是什么?

示例 1:对于 (a, b, c, d):

  • bdca (匹配)
  • adb (匹配)
  • abcg(失败:'g'不在集合中)
  • aab(失败:集合中只有一个“a”)

示例 2:对于 (a, a, c, d):

  • adca (匹配)
  • aaad(失败:第三个​​a不在集合中)
  • 这些也应该有效:a、aa、dc、aac、ada、acd 和 daca。但不是这个:aaca、acada、accd、abcdef

换句话说,每个使用过的角色都会被消耗掉。所以我们可以使用所有给定的字符或只使用其中的一部分,但没有多余的字符或重复使用超过每个字符的给定数量。

我尝试了几个正则表达式,但没有找到任何好的解决方案。

请帮忙?

【问题讨论】:

  • 适用于哪种语言?
  • this post相关
  • 为什么是正则表达式?看起来更像是固定的东西。
  • 标准正则表达式更好。但我希望将其用于 mysql 请求
  • 没有办法只用 mysql 正则表达式。您所能做的就是过滤带有外来字符的字段并计数。如果您的问题与mysql有关,请添加正确的标签。

标签: mysql regex string


【解决方案1】:

不是只是正则表达式工作,但我认为这会工作:

  1. 对模式字母进行排序。 (来自您的示例:abcdaacd
  2. 插入正则表达式代码:aacd -> ^a?a?c?d?$
  3. 对字符串进行排序
  4. 对照修改后的模式检查字符串。

(如果您需要禁止空字符串,这可能是一个额外的检查。)

【讨论】:

    【解决方案2】:

    虽然正则表达式会变得超长,但您想在此处包含的字符越多,这里只是 3 个字符的示例:

    简短示例 1:for (a, b, c):

    • bca(匹配)
    • acb(匹配)
    • abg(失败:'g'不在集合中)
    • aab(失败:集合中只有一个“a”)

    ^(a(b(c)?)?|a(c(b)?)?|b(a(c)?)?|b(c(a)?)?|c(a(b)?)?|c(b(a)?)?)

    简短示例 2:for (a, a, c):

    • aca(匹配)
    • aaa(失败:第三个“a”不在集合中)

    ^(a(a(c)?)?|a(c(a)?)?|a(a(c)?)?|a(c(a)?)?|c(a(a)?)?|c(a(a)?)?)

    或(可选)缩短以删除重复测试:

    ^(a(a(c)?)?|a(c(a)?)?|c(a(a)?)?)

    怎么做?

    基本上,这由以下(a(b(c)?)? 的组合组成,其中第一个之后的所有字符都是可选的。对于abc| 结合在一起的每个可能的排列,存在一个。

    【讨论】:

    • 感谢您的回答,如果我需要为正则表达式生成排列,那么我将直接为字符串做!我认为这不适用于大量字符(在我的情况下,我需要 7 到 10 个字符)
    • 假设没有重复,我猜这对于这些长度来说效果不佳,因为正则表达式对于 7 个字符串的长度约为 1091 个字符,对于 10 个字符串的长度约为 3422 个字符。
    • 您可能会发现所有排列与| 的简单组合会导致字符数减少。
    猜你喜欢
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2022-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多