我想匹配从0到15的序数二进制数,这些数字是连续写的(实际之间没有空格):
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
我需要一种非常简短的方法来使用表达式来实现它,它应该匹配它!我指的是匹配的域名!而已!我不想匹配类似的一个:
0000 0010 0001 0011 0100 0110 0101 0111 1000 1001 1010 1011 1100 1101 1110 1111
我尝试的是((00)[01]{2}){4}((01)[01]{2}){4}((10)[01]{2}){4}((11)[01]{2}){4}
我知道这不准确因此我在这里问过。
答案 0 :(得分:3)
听起来你想要一个匹配给定字符串的短正则表达式,但不匹配二进制数重新排序的任何相同形式的字符串。这个正则表达式不能满足这一要求,但它至少解决了http://regex.alf.nu中的“长计数”难题:
((\d+)0 \2[1] ?){8}
答案 1 :(得分:1)
这个答案将作为一个提示来解决这个谜题,其中字符串要少得多。
这个解决方案在很大程度上依赖于所有二进制数都是固定宽度(在这种情况下是4位)的假设。
我们将尝试比较两个相邻的数字,而不是直接计算数字。
让我们假设我们现在处于二进制数的开头(不是任意的某个地方)。我们希望前面的数字严格地比后面的数字要小。
要比较2个二进制数字与固定宽度,我们可以从左到右移除相似的数字,直到所有数字都被移除(相等)或存在差异。由于前面的数字严格较小,因此必须存在差异,前面的数字为0,后面的数字为1。我们可以为此写一个零宽度的前瞻断言:
(?=([01]*)0[01]* (\1)1)
(至少在JavaScript中需要\1
左右的括号,以防止形成八进制转义序列\11
)。
为了消除我们在二进制数字开头的假设,我们只需要添加锚点,并消耗字符,以便我们最终在下一个数字的开头。
^(?=([01]*)0[01]* (\1)1)....[ ]
由于我们已经断言了数字的递增顺序,我们只需要通过重复来断言二进制数的数量。
^(?:(?=([01]*)0[01]* (\1)1).... ){15}1111$
这个问题可以扩展为断言一个由2 ^ n固定宽度的n位宽二进制字符串组成的字符串是严格增加的。它还可用于断言一系列固定宽度的二进制数正在增加。该技术也可用于断言词典顺序中列出的单词,尽管正则表达式会很长。
答案 2 :(得分:0)
(\60){7}(100)(\2\1)(110)\3(101)01\2(111)\3(\2\4)\5\1\6\7\6\5\6
所以我做到了!长时间在这个正则表达式上,长度为62个字符,比字符串本身少2个字符。