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

我见过正则expression式模式使用明确的数字重复,而不是?*+ ,即:

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

问题是:

  • 这两种forms是相同的吗? 如果你添加所有格/不情愿的修饰词怎么办?
  • 如果它们是相同的,哪一个更习惯? 更可读? 只是“更好”?

据我所知他们是相同的。 我认为可能有几个引擎不支持编号的语法,但我不知道是哪个。 我依稀记得几天前的一个问题,在Notepad ++中,显式表示法不起作用。

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

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

我倾向于更喜欢这些,特别是当重复模式超过几个字符时。 如果你必须匹配3个数字,有些人喜欢写: \d\d\d但我宁愿写\d{3}因为它强调重复的次数。 此外,如果这个数字需要改变,那么我只需要改变{3}{n}而不是重新parsing我脑海中的正则expression式,或者担心把它搞乱。 它需要较less的精力。

如果不符合这个标准,我更喜欢速记。 使用“显式”符号很快就会混淆模式,使其难以阅读。 我曾经参与过一个项目,一些开发人员不太了解正则expression式(这不完全是每个人最喜欢的话题),而且我看到很多{1}{0,1}事件。 有几个人会要求我对代码进行编码审查,那就是在什么时候build议将这些事件改为速记符号,节省空间,而IMO则提高可读性。

我可以看到,如果你有一个正则expression式有很多有限的重复,你可能想要一直使用{n,m}forms来保持可读性。 例如:

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

但是我不记得在现实生活中遇到过这样的情况。 当我在问题中使用{0,1}{0,}{1,} ,实际上总是由于无知而完成的。 而在回答这个问题的过程中,我们也应该build议他们使用?*+

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

  • 除非你使用了一个特殊的正则expression式引擎,否则它们是完全相同的。 但是,并不是所有的正则expression式引擎都支持编号重复, ?+

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

它们是相同的(你会通过testing你的上下文来发现它们是否可用。)

我预料到的问题是,当你可能不是唯一需要使用你的代码的人。 正则expression式对于大多数人来说已经够难了。 每当有人使用一种不寻常的语法时,就会产生这样的问题:“他们为什么不以标准的方式去做呢?他们以为我错过了什么?