使用显式编号的重复代替问号、星号和加号

70

我曾经见过一些正则表达式模式,使用明确的数字重复次数来代替?*+,例如:

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

问题是:

  • 这两种形式是否相同?如果添加所有格/不情愿修饰符会发生什么?
  • 如果它们相同,哪种更符合习惯用语?更易读?更好吗?
4个回答

96
据我所知,它们是相同的。我认为可能有一些引擎不支持编号语法,但我不确定是哪些。我模糊地记得几天前在SO上有一个问题,在Notepad++中显式标记无法工作。
我唯一会使用显式编号重复的情况是当重复次数大于1的时候:
- 正好为两个:{2} - 两个或更多:{2,} - 两到四个:{2,4} 尤其是当重复的模式超过几个字符时,我倾向于使用这些。如果你必须匹配3个数字,有些人喜欢写:\d\d\d,但我宁愿写\d{3},因为它强调了所涉及的重复次数。此外,如果那个数字以后需要更改,我只需要将{3}更改为{n},而不需要重新解析正则表达式或担心弄乱它;它需要更少的思考。
如果不符合这个条件,我会更喜欢使用简写。使用“显式”标记会迅速使模式混乱,并使其难以阅读。我曾经参与过一个项目,其中一些开发人员对正则表达式不太熟悉(它并不是每个人都喜欢的话题),我看到了很多{1}{0,1}出现。有些人会请我审查他们的模式,那时我会建议将这些出现更改为简写符号,并节省空间和改善可读性。

+1,我也认为速记法更好,但我也热爱嵌套三元运算符,并因此而受到了虚拟呼喊。我能理解有些人可能认为 {0,1}? 更清晰地显示意图,因此提出了问题。 - polygenelubricants

8

如果您有一个正则表达式需要做很多有限重复,您可能希望出于可读性考虑始终使用{n,m}形式。例如:

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

但是我从未在现实生活中看到过这样的情况。当我看到问题中使用{0,1}{0,}{1,}时,几乎总是出于无知而使用。在回答这样的问题的过程中,我们还应该建议他们使用?*+代替。

当然,{1}纯属杂物。有些人似乎模糊地认为它意味着“一个且仅一个”——毕竟,它必须意味着某些东西,对吧?为什么这样一种病态简洁的语言支持一个占据整个三个字符并且根本不起作用的结构?我所知道的它唯一合法的用途是隔离后面跟着一个数字字面值的反向引用(例如\1{1}0),但是有其他方法可以做到这一点。


2
  • 除非您使用的是特殊的正则表达式引擎,否则它们都是相同的。然而,并不是所有的正则表达式引擎都支持数字重复,?+

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


1

它们是等效的(通过测试您的上下文,您将发现它们是否可用)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接