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

Posted

技术标签:

【中文标题】使用明确编号的重复而不是问号、星号和加号【英文标题】:Using explicitly numbered repetition instead of question mark, star and plus 【发布时间】:2011-03-03 05:37:12 【问题描述】:

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

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

问题是:

这两种形式是否相同?如果添加所有格/不情愿修饰语会怎样? 如果它们相同,哪一个更惯用?更具可读性?只是“更好”?

【问题讨论】:

【参考方案1】:

据我所知,它们是相同的。我认为可能有一些引擎不支持编号语法,但我不确定是哪个。我隐约记得几天前关于 SO 的一个问题,其中显式表示法在 Notepad++ 中不起作用。

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

正好两个:2 两个或更多:2, 二到四:2,4

我更喜欢这些,尤其是当重复模式超过几个字符时。如果你必须匹配 3 个数字,有些人喜欢写:\d\d\d,但我更愿意写 \d3,因为它强调所涉及的重复次数。此外,如果该数字需要更改,我只需将3 更改为n,而不需要重新解析我脑海中的正则表达式或担心搞砸;它需要更少的脑力劳动。

如果不满足该条件,我更喜欢简写。使用“显式”表示法会很快使模式变得混乱并使其难以阅读。我参与过一个项目,其中一些开发人员不太了解正则表达式(这并不是每个人都喜欢的话题),我看到很多 10,1 出现。一些人会要求我对他们的模式进行代码审查,那时我会建议将这些出现更改为简写符号并节省空间,并且 IMO 会提高可读性。

【讨论】:

+1,我也认为速记更好,但我也喜欢嵌套的三元组,而且我几乎因为这样做而被大喊大叫。我可以看到有些人可能会认为0,1?“更清楚地显示意图”,因此是 Q。【参考方案2】:

我可以看到,如果您有一个执行大量有界重复的正则表达式,为了便于阅读,您可能希望始终使用n,m 表单。例如:

/^
 abc2,5
 xyz0,1
 foo3,12
 bar1,
 $/x

但我不记得在现实生活中见过这样的案例。当我看到0,10,1, 被用在一个问题中时,实际上都是出于无知。而在回答此类问题的过程中,我们也应该建议他们改用?*+

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

【讨论】:

【参考方案3】:

除非您使用特殊的正则表达式引擎,否则它们都是相同的。但是,并非所有正则表达式引擎都支持编号重复,?+

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

【讨论】:

【参考方案4】:

它们是等价的(您可以通过测试上下文来确定它们是否可用。)

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

【讨论】:

以上是关于使用明确编号的重复而不是问号、星号和加号的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JFileChooser 保存对话框中处理问号或星号(“?”或“*”)?

linux sed命令中的正则表达式问号加号圆括号等需要转义

为啥我在 DataGridView 中有问号而不是文本?

在 Flutter 包中使用自定义图标字体显示问号而不是自定义图标

php输入数据库,显示为问号,而不是应该的中文?

(问号) 而不是旧页面上的ÅÄÖ