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

pol*_*nts 54 regex readability repeat

我已经看到使用显式编号重复的正则表达式模式而不是?,*+,即:

Explicit            Shorthand
(something){0,1}    (something)?
(something){1}      (something)
(something){0,}     (something)*
(something){1,}     (something)+
Run Code Online (Sandbox Code Playgroud)

问题是:

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

Ahm*_*eed 70

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

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

  • 正好两个: {2}
  • 两个或两个以上: {2,}
  • 二到四个: {2,4}

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

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


Ala*_*ore 7

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

/^
 abc{2,5}
 xyz{0,1}
 foo{3,12}
 bar{1,}
 $/x
Run Code Online (Sandbox Code Playgroud)

但我记不起在现实生活中见过这样的情况.当我看到{0,1},{0,}或者{1,}在一个问题中使用,它几乎总是被做出来的无知.在回答这个问题的过程中,我们也应该建议他们使用?,*或者+代替.

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