2位数只允许一次(正则表达式)

时间:2013-11-11 15:47:05

标签: regex unix

我正在尝试检查某个级别是否有效。 级别的形式如下:(但他们还有998个)

bbbbbbb
b41111b
b81400b
b81010b
b01121b
b08001b
bbbbbbb

关卡必须遵循一些规则。我写了一个正则表达式,以符合所有规则,但一个: 级别必须包含1次2和1次4。 (注意在上面的级别中有两个4和一个2.上面的级别无效。)

这是一个学校项目,请指导我完成答案。 提前谢谢。

编辑:

我现在的正则表达式是:

^b{' + str(length) + r'}\n(b{1}[0-8]{' + str(length - 2) + r'}b{1}\n)+b{' + str(length) + '}$

对于上述级别,长度= 7 请注意,它甚至没有尝试过滤上面这个错误的级别。 其他规则是:

  1. 关卡必须用'b'
  2. 包围
  3. 该级别只能包含char'b'和小于9的数字。
  4. 只能有一个2
  5. 只能有一个4
  6. 上面我的正则表达式确实考虑了规则1和规则2,但我仍需要弄清楚规则3和规则4.

    我已经尝试过等等,无法弄明白。

3 个答案:

答案 0 :(得分:0)

好吧,正好1 a的正则表达式是[^a]*a[^a]*(也就是说,非a的可能是空的序列,后跟a,然后是可能的非a的空序列。我会留下一个练习如何处理多行&确保这涵盖整个层面。

对于1 a和1 b[^ab]*((a[^ab]*b)|(b[^ab]*a))[^ab]*,请注意相同。说明:一个非a或b的序列,遵循EITHER 1)a,一个非a或b的运行,ab或2)ab,一个非a或b的运行和一个a,然后是一个非a-or-b的运行。

答案 1 :(得分:0)

答案是使用负向预测来锚定输入开始。

目前还不清楚你要匹配什么,所以我只会使用占位符<your-regex>来表示当前的正则表达式:

^(?!.*?2.*?2)(?!.*?4.*?4)<your-regex>

查看live demo的正确拒绝超过1“2”的内容。

答案 2 :(得分:0)

这是符合您所有条件的正则表达式:

^b(?!(?:[^2]*2){2,})(?!(?:[^4]*4){2,})[b0-8]*b$
  • 使用^b$b
  • 开始和结束
  • 它仅包含字母b和[b0-8]*
  • 的数字0-8
  • 使用(?!(?:[^2]*2){2,})
  • 不允许超过一位数2
  • 使用(?!(?:[^4]*4){2,})
  • 不允许超过一位数4