使用正则表达式从字符串中获取数字对

Posted

技术标签:

【中文标题】使用正则表达式从字符串中获取数字对【英文标题】:Get pairs of digit from string with regexp 【发布时间】:2014-06-03 04:17:36 【问题描述】:

我发现了类似的问题Regular expression to match sets of numbers that are not equal nor reversed,但我的正则表达式很糟糕,所以需要一个建议。 我有字符串,即:3344654865,我需要知道第一个字符是两个不相等的对。 我试过这个正则表达式

^(?:(\d)(?:\1)(\d)(?:\2))

但它只捕获一对中的第一个数字

1.  [0-1]   `3`
2.  [2-3]   `4`

在示例 3344654865 中,它应该捕获两对数字,其中对内的数字等于 3=3 和 4=4。 如何升级我的正则表达式,它将从字符串的开头返回两个不相等的对?

【问题讨论】:

这个例子你想要的输出是什么? 【参考方案1】:

这对我有用^((\d)\2)(?!\1)(\d)\3.* 匹配第一个字符是两个不相等的对Demo

更新:每个请求 ^((\d)\2)(?!\1)((\d)\4) 所需的匹配都没有。 1 & 3Demo

如果匹配必须是 1 和 2,则使用以前的模式之一来验证它是否符合您的标准,然后应用此模式 ^(\d\d)(\d\d)

【讨论】:

哦,它有可能返回 1.33 2.44 而不是 1.33 2.3 3.4 吗? ^((\d)\2)(?!\1)((\d)\4) 使用匹配#1 & 3【参考方案2】:
^((\d)\2)(?!\1)((\d)\4)

结果:

3344654865 -> (33, 3, 44, 4)
12345      -> fail (digits not same in pairs)
9          -> fail (too short)
3333       -> fail (two pairs same)

很难消除一个字符的中间组,因为反向引用需要它们。

【讨论】:

它确实有效,说它不匹配 (33 -> fail, 34 -> 34, 345 -> 34),根据您的规范(“我需要知道第一个字符是两个不相等的对")。否则我不明白你的问题;请指定所需的输入和所需的输出。 输入:3344654865 所需输出:3344 抱歉我的解释不好 输入 3737 的输出是什么? 12345怎么样? 9 点呢? 在 3737 的例子中应该被跳过。我试图得到第一个和第二个数字相等的对,即 55、77 等。 为什么不完全回答这个问题? 12345 是否有效?成对的数字是否应该相同(如3344),还是在您的情况下只是巧合,因为它没有明确列出,除非在您声明的代码示例中不起作用?我认为是的,但是对于未来,您需要为正则表达式匹配编写几个案例,以涵盖所有情况,而不仅仅是您正在考虑的理想情况。【参考方案3】:

这个:

^(\d+?)(?!\1)(\d+)

会给你:

 33 - 44654865

使第二部分的长度相同并非易事,但保证第二部分的第一个数字与第一个不一样。所以你必须自己去拿。

不是微不足道的,我的意思是你需要用交替或循环尝试 1 位、2 位、3 位等等。

【讨论】:

以上是关于使用正则表达式从字符串中获取数字对的主要内容,如果未能解决你的问题,请参考以下文章

通过正则表达式获取逗号分隔的数字

正则表达式仅从字符串中获取 NUMBER

使用正则表达式从字符串中获取子字符串

用于在数字之前从 csv 中提取字符串的正则表达式

iOS之正则表达式的使用

Amazon redshift 在字符串正则表达式后获取数字