使用明确编号的重复而不是问号,星号和加号

时间:2010-06-13 14:39:03

标签: regex readability repeat

我见过使用明确编号重复而不是?*+的正则表达式模式,即:

Explicit            Shorthand
(something){0,1}    (something)?
(something){1}      (something)
(something){0,}     (something)*
(something){1,}     (something)+

问题是:

  • 这两种形式是否相同?如果添加占有/不情愿的修饰符怎么办?
  • 如果它们相同,哪一个更惯用?更具可读性?只是“更好”?

4 个答案:

答案 0 :(得分:64)

据我所知,他们是完全相同的。我想可能有一些引擎不支持编号语法,但我不确定哪个。我几天前依旧回忆起一个关于SO的问题,其中显式符号在Notepad ++中不起作用。

我唯一一次使用明确编号的重复是重复大于1的时候:

  • 正好两个:{2}
  • 两个或更多:{2,}
  • 二至四:{2,4}

我倾向于喜欢这些,特别是当重复的模式超过几个字符时。如果你必须匹配3个数字,有些人喜欢写:\d\d\d但我宁愿写\d{3},因为它强调所涉及的重复次数。此外,如果这个数字需要改变,我只需将{3}更改为{n},而不是重新解析我头脑中的正则表达式或担心弄乱它;它需要较少的心理努力。

如果不符合标准,我更喜欢速记。使用“显式”符号会很快混乱模式并使其难以阅读。我参与了一个项目,其中一些开发人员不太了解正则表达式(这不是每个人最喜欢的主题),我看到了很多{1}{0,1}次出现。有些人会要求我对他们的模式进行编码检查,那时我会建议将这些事件更改为速记符号并节省空间,IMO会提高可读性。

答案 1 :(得分:7)

我可以看到,如果你的正则表达式有很多有限的重复,你可能想要一致地使用{n,m}形式以便于阅读。例如:

/^
 abc{2,5}
 xyz{0,1}
 foo{3,12}
 bar{1,}
 $/x

但我不记得曾经在现实生活中看到过这样的情况。当我在问题中看到{0,1}{0,}{1,}时,它几乎总是出于无知而完成。在回答此类问题的过程中,我们还应建议他们使用?*+代替。

当然,{1}是纯粹的混乱。有些人似乎有一个模糊的概念,即它意味着“唯一的一个” - 毕竟,它必须意味着某种东西,对吧?为什么这种病态简洁的语言支持一个占据整个三个字符并且什么都不做的构造?我所知道的唯一合法用途是隔离后面跟着一个字面数字的反向引用(例如\1{1}0),但还有其他方法可以做到这一点。

答案 2 :(得分:2)

  • 除非您使用特殊的正则表达式引擎,否则它们都是相同的。但是,并非所有正则表达式引擎都支持编号重复,?+

  • 如果所有这些都可用,我会使用字符而不是数字,因为它对我来说更直观。

答案 3 :(得分:1)

它们是等价的(你会通过测试你的背景知道它们是否可用。)

我预料到的问题是,您可能不是唯一需要使用代码的人。 对大多数人来说,正则表达式已经足够困难了。任何时候有人使用不寻常的语法,问题 出现了:“他们为什么不按标准方式去做?他们认为我失踪了什么?”