防止ABNF中的重复字符

问题描述:

我想创建一个包含字符“imsxeADSUXju”的ABNF规则。每个字符都是可选的。顺序无关紧要,但角色可能不会出现一次以上。防止ABNF中的重复字符

例如:它必须匹配

"i" "im" "mi" "" "uUsejXx" "imsxeADSUXju" 

但不能匹配

"iim" "UmUu" "imsss" 

我创建了下面的规则,但它并不能防止出现一个字符不止一次:

options = 0*12("i"/"m"/"s"/"x"/"e"/"A"/"D"/"S"/"U"/"X"/"j"/"u") 

在这条规则中,订单很重要:

options = [ "i" ] [ "m" ] [ "s" ] [ "x" ] [ "e" ] [ "A" ] [ "D" ] [ "S" ] [ "U" ] [ "X" ] [ "j" ] [ "u" ] 

我该如何编写一个忽略顺序但也阻止双打的规则?

+0

你有没有尝试过类似递归规则有一个已经看到的字符数组,并将该数组填充到规则中作为不匹配?我不知道ABNF是否真的很好,但是这个想法是值得尝试的。对不起,如果不是。 – Eregrith 2014-11-04 10:32:37

不幸的是你必须写出所有的选择。忽略ABNF是不区分大小写的,它必须是

S  = "i" after-i/
      "m" after-m/
      ... 
    after-i = "m" after-im/
      "s" after-is/
      ... 
    after-im = "s" after-ims/
      ... 

这里的语言是有规律的,如果你考虑如何最小DFA的语言会是什么样子,那就必须有2^12个州并且每个状态将对应于字母表的powerset的一个元素,编码已经看过哪些字符。