使用明确编号的重复而不是问号、星号和加号
-
27-09-2019 - |
题
我见过使用显式编号重复而不是 ?
, *
和 +
, , IE。:
Explicit Shorthand
(something){0,1} (something)?
(something){1} (something)
(something){0,} (something)*
(something){1,} (something)+
问题是:
- 这两种形式相同吗?如果添加所有格/不情愿修饰语怎么办?
- 如果它们相同,哪一个更惯用?更具可读性?仅仅是“更好”吗?
解决方案
据我所知,它们是相同的。我认为可能有一些引擎不支持编号语法,但我不确定是哪一个。我依稀记得几天前关于 SO 的一个问题,明确的符号在 Notepad++ 中不起作用。
我唯一会使用明确编号的重复是当重复大于 1 时:
- 正好两个:
{2}
- 两个或两个以上:
{2,}
- 二到四:
{2,4}
我倾向于更喜欢这些,尤其是当重复模式超过几个字符时。如果必须匹配 3 个数字,有些人喜欢这样写: \d\d\d
但我宁愿写 \d{3}
因为它强调所涉及的重复次数。此外,如果这个数字需要改变,我只需要改变 {3}
到 {n}
不要在我的脑海中重新解析正则表达式,也不担心把它弄乱;它需要更少的脑力劳动。
如果不满足该标准,我更喜欢速记。使用“显式”符号很快就会使模式变得混乱并且难以阅读。我曾经参与过一个项目,其中一些开发人员不太了解正则表达式(这并不是每个人最喜欢的主题),并且我看到了很多 {1}
和 {0,1}
发生。有些人会要求我对他们的模式进行代码审查,那时我会建议将这些事件更改为速记符号并节省空间,并且在我看来,提高可读性。
其他提示
我可以看到,如果您有一个执行大量有限重复的正则表达式,您可能需要使用 {n,m}
为了可读性,形式一致。例如:
/^
abc{2,5}
xyz{0,1}
foo{3,12}
bar{1,}
$/x
但我不记得在现实生活中见过这样的案例。当我看见 {0,1}
, {0,}
或者 {1,}
在问题中使用它实际上总是出于无知。在回答这样的问题的过程中,我们还应该建议他们使用 ?
, *
或者 +
反而。
而且当然, {1}
是纯粹的混乱。有些人似乎有一个模糊的概念,认为它的意思是“唯一的一个”——毕竟,它一定意味着 某物, , 正确的?为什么这样一种病态的简洁语言会支持一个占据整个三个字符并且什么也不做的结构?据我所知,它的唯一合法用途是隔离后跟文字数字的反向引用(例如 \1{1}0
),但还有其他方法可以做到这一点。
除非您使用特殊的正则表达式引擎,否则它们都是相同的。但是,并非所有正则表达式引擎都支持编号重复,
?
或者+
.如果所有这些都可用,我会使用字符而不是数字,因为这对我来说更直观。
它们是等效的(并且您可以通过测试您的上下文来了解它们是否可用。)
我预计的问题是,您可能不是唯一需要使用您的代码的人。正则表达式对于大多数人来说已经足够困难了。每当有人使用异常语法时,就会出现问题:“他们为什么不按照标准方式来做呢?他们认为我失踪了什么?”