【问题标题】:Match using [] - Only first part X number of times (using {})使用 [] 匹配 - 仅第一部分 X 次(使用 {})
【发布时间】:2016-03-20 19:35:09
【问题描述】:

对不起,标题很糟糕,但这很难概括。

所以,假设我有以下数据:

123
1 2 3
12 3
1  2  3
1  23

123 可以替换为任意数字 (\d)

我需要匹配所有仅使用 RegEx 的人,我想知道这是否可能(顺便说一下,这是一种假设情况,因此无需担心语言或我为什么需要这个)。

为了匹配第一种情况,123,我可以使用这个正则表达式:\d{3}。现在,如果我想包含匹配的空格,并且整个内容长度为 3 位数字/字母,我可以使用 [\d\s]{3}。但是,这将匹配第一种情况,但为了匹配第二种情况,我必须将其更改为 [\d\s]{5}

我想要的是能够选择重复的次数(在本例中为{3}),但是数字之间可以有任意数量的空格。

我可以使用\d\s*\d\s*\d\s*,但这非常低效。使用[\d\s*]{3}也不起作用,原因同上。

也许可以使用捕获组,希望你能看到我想要得到的:

[(\d)\s*]$1{3}

【问题讨论】:

  • 您应该注意,* 在字符类中丢失了它的元字符函数,并且只匹配字面意思,因此[\d\s*] 匹配 1 个空格或 1 个数字或 1 个 *
  • @SebastianProske 是的,我知道,它只是展示了我想要实现的目标。我现在编辑并输入(),谢谢!
  • 您的编辑让事情变得更糟——括号在字符类中没有元字符功能。只有- 用作范围,^ 用作否定(如果放在开头)
  • @SebastianProske 谢谢,我没有意识到这一点。我会撤消它。
  • 这是对第一个捕获组的反向引用,再次匹配它的内容。

标签: regex


【解决方案1】:

试试这个正则表达式

正则表达式: (?:\d\s*){3}

说明:

  • (?:\d\s*) 将匹配任何digit 后跟zero 或更多空格,使用{3} 将重复3 次。

Regex101 Demo

P.S:您已经接近解决方案。您应该使用捕获组 () 而不是字符类 []

字符类的作用是选择提到的字符之一。

【讨论】:

  • 您可以跳过捕获部分,只需使用(?:\d\s*){3}进行分组
  • @Alec:是的,我们可以,但这里的反向引用并没有用完。无论如何感谢您的建议。
  • 不捕获可能会稍微快一点,尽管您很可能不会注意到正常使用的差异
  • @Alec:如果你这么说。完成!
  • 谢谢,我早该想到的!
猜你喜欢
  • 2021-03-01
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
相关资源
最近更新 更多