正则表达式由给定字符集形成的字符串

时间:2015-12-08 11:52:12

标签: mysql regex string

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

Example1 :for(a,b,c,d):

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

Example2 :for(a,a,c,d):

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

换句话说,每个使用过的角色都会消耗掉。所以我们可以使用所有给定的字符或仅使用其中的一些字符,但是没有额外的字符或重复使用超过每个字符的给定数量。

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

请帮忙吗?

2 个答案:

答案 0 :(得分:1)

只是正则表达式工作,但我认为这样可行:

  1. 对模式字母进行排序。 (来自您的示例:abcdaacd
  2. 插入正则表达式代码:aacd - > ^a?a?c?d?$
  3. 对字符串进行排序
  4. 根据修改的模式检查字符串。
  5. (如果您需要禁止空字符串,则可能需要额外检查。)

答案 1 :(得分:0)

虽然正则表达式会变得超长,但是你想要包含的字符越多,只有3个字符的例子:

简短示例1:对于(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:对于(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|的每个可能排列。