Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用显式编号的重复,而不是问号、星号和加号_Regex_Readability_Repeat - Fatal编程技术网

Regex 使用显式编号的重复,而不是问号、星号和加号

Regex 使用显式编号的重复,而不是问号、星号和加号,regex,readability,repeat,Regex,Readability,Repeat,我见过使用显式编号重复而不是?、*和+的正则表达式模式,即: Explicit Shorthand (something){0,1} (something)? (something){1} (something) (something){0,} (something)* (something){1,} (something)+ 问题是: 这两种形式相同吗?如果添加所有格/不情愿修饰语怎么办 如果它们是相同的,哪一个更地道?更具可读性?只是

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

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}
    ,而不必在头脑中重新解析正则表达式或担心弄乱它;它需要较少的脑力劳动

    如果不符合这个标准,我更喜欢速记。使用“显式”表示法会很快弄乱模式,使其难以阅读。我曾经参与过一个项目,其中一些开发人员对regex不太了解(这并不是每个人都喜欢的主题),我看到了大量出现的
    {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
    ),但还有其他方法可以做到这一点。

    +1,我也认为速记更好,但我也喜欢嵌套三元组,而且我几乎为此受到了责骂。我可以看出,有些人可能认为
    {0,1}
    更清楚地表达了意图,因此Q。