3

我正在尝试检查一个级别是否有效。该级别的形式为:(但它们还有 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) + '}$

对于上面的级别,length = 7 请注意,它甚至不会尝试过滤上面的错误级别。其他规则是:

  1. 级别必须用“b”包围
  2. 该级别只能包含字符 'b' 和小于 9 的数字。
  3. 只能有一个 2
  4. 只能有一个 4

我上面的正则表达式确实考虑了规则 1 和 2,但我仍然需要弄清楚规则 3 和 4。

我已经尝试过环顾四周等,无法弄清楚。

4

3 回答 3

0

好吧,正好 1 的正则表达式a将是[^a]*a[^a]*(即,一个可能为空的非 - 序列a,后跟一个 a,然后是一个可能为空的非 - 序列a)。我将把它作为练习如何处理多行并确保这涵盖整个级别。

对于 1a和 1 b: [^ab]*((a[^ab]*b)|(b[^ab]*a))[^ab]*,具有相同的警告。解释:一系列非 a 或 b 的序列,后跟 1) 一个 a,一个非 a 或 b 的序列,和 ab,或 2) ab,一个非 a 或 b 的序列, 和 a, THAT 后跟一系列非 a-or-b。

于 2013-11-11T15:54:19.863 回答
0

答案是使用锚定到输入开始的负前瞻。

目前尚不清楚您要匹配什么,因此我将只<your-regex>为您当前的正则表达式使用占位符:

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

查看rhis 正确拒绝超过 1 个“2”的现场演示。

于 2013-11-11T15:54:42.850 回答
0

这是满足您所有条件的正则表达式:

^b(?!(?:[^2]*2){2,})(?!(?:[^4]*4){2,})[b0-8]*b$
  • 它以 b 开头和结尾 使用^band$b
  • 它仅由字母 b 和数字 0-8 组成[b0-8]*
  • 通过使用它不会允许超过一个数字 2(?!(?:[^2]*2){2,})
  • 通过使用它不会允许超过一位数字 4(?!(?:[^4]*4){2,})
于 2013-11-11T17:02:43.803 回答