65

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

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

问题是:

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

4 回答 4

88

据我所知,它们是相同的。我认为可能有一些引擎不支持编号语法,但我不确定是哪个。我隐约记得几天前关于 SO 的一个问题,其中显式符号在 Notepad++ 中不起作用。

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

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

我倾向于更喜欢这些,尤其是当重复模式超过几个字符时。如果你必须匹配3个数字,有些人喜欢写:\d\d\d但我更愿意写\d{3},因为它强调所涉及的重复次数。此外,如果这个数字需要改变,我只需要改变{3}{n}不是重新解析我脑海中的正则表达式或者担心把它搞砸;它需要较少的脑力劳动。

如果不满足该标准,我更喜欢简写。使用“显式”表示法会很快使模式变得混乱并使其难以阅读。我参与过一个项目,其中一些开发人员不太了解正则表达式(这并不是每个人都喜欢的话题),我看到了很多{1}{0,1}发生的事情。一些人会要求我对他们的模式进行代码审查,那时我会建议将这些出现更改为速记符号并节省空间,并且 IMO 会提高可读性。

于 2010-06-13T15:27:00.660 回答
8

我可以看到,如果您有一个执行大量有界重复的正则表达式,那么{n,m}为了便于阅读,您可能希望始终使用该表单。例如:

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

但我不记得在现实生活中见过这样的案例。当我看到或被用于一个问题时{0,1},它几乎总是出于无知。而在回答这样一个问题的过程中,我们也应该建议他们使用,代替。{0,}{1,}?*+

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

于 2010-06-13T22:16:15.483 回答
2
  • 除非您使用特殊的正则表达式引擎,否则它们都是相同的。但是,并非所有正则表达式引擎都支持编号重复,?或者+.

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

于 2010-06-13T15:29:11.173 回答
1

它们是等价的(您可以通过测试上下文来确定它们是否可用。)

我预计的问题是,您可能不是唯一需要使用您的代码的人。对于大多数人来说,正则表达式已经够难了。每当有人使用不寻常的语法时,就会出现问题:“他们为什么不按标准方式来做?他们认为我错过了什么?”

于 2010-06-13T16:10:55.647 回答