【问题标题】:How Can i write a regexp that will allow only digits and comas and only digits at the beginning and the end of the string?我如何编写一个只允许数字和逗号以及字符串开头和结尾的数字的正则表达式?
【发布时间】:2018-07-13 10:11:33
【问题描述】:

我如何编写一个正则表达式,它将检查字符串是否以数字开头和结尾,并且两者之间仅包含数字和逗号?昏迷也必须用至少一位数字彼此分开。对于上述条件,我有以下正则表达式:^\d(,?\d)*$ 但我有以下附加条件:由数字序列组成的所有逗号分隔的整数必须彼此不同。什么是只允许这种字符串的正则表达式?

谢谢

【问题讨论】:

  • @WiktorStribiżew 非常感谢您的回复。如何修改正则表达式以使逗号之间的数字序列都不同?我要编辑我的问题
  • 请添加到目前为止您尝试过的内容,顺便说一句。
  • @WiktorStribiżew 对于我最初的问题,我有以下正则表达式: ^\d(,?\d)*$ 你对这个正则表达式有什么看法?在这一点上,我无法为我的第二个问题提出解决方案,但正在努力解决。解决方案背后的想法是什么?

标签: regex


【解决方案1】:

首先,您的正则表达式包含未量化的\d,并且仅匹配单个数字。您需要在\d 之后添加+ 以匹配1 个或多个数字。

为避免重复值,您可以使用

^(?!.*\b(\d+)\b.*\b\1\b)\d+(?:,\d+)*$
 ^^^^^^^^^^^^^^^^^^^^^^^

regex demo

(?!.*\b(\d+)\b.*\b\1\b) 是一个负前瞻,如果在除换行符之外的任何 0+ 个字符之后,有一组数字出现在字符串的后面(在另一个 0+ 个字符之后,而不是换行符字符)。

详情

  • ^ - 字符串开头
  • (?!.*\b(\d+)\b.*\b\1\b) - 如果文本中出现相同的值,则匹配失败
  • \d+ - 1 位以上
  • (?:,\d+)* - 零次或多次出现
    • , - 逗号
    • \d+ - 1 位以上
  • $ - 字符串结束。

【讨论】:

  • 亲爱的 Wiktor,目前我正在尝试通过自己编写正则表达式来理解,您的示例对我有很大帮助。我写了以下简单的正则表达式:(\d++)(?!(,\1)) 如您所见,它不应该匹配 123 的整个第一次出现,但它只匹配第一个字符 1 并匹配 23。为什么会发生这种情况?编写此正则表达式的正确方法是什么?
  • @TornikeShavishvili 正确的正则表达式在我的回答中。 (\d++)(?!(,\1)) 匹配 1+ 个不跟在 , 后面的数字和这串数字。
  • 亲爱的 Wiktor,我终于能够构建我的正则表达式了。它看起来像这样: [^\b([1-9]\d*+|0)(?!([0-9,]*,\1(?!\d)))((,([1 -9]\d*+|0))(?!([0-9,]*\4(?!\d))))*$](regex101.com/r/hXo5xY/2) 它只匹配逗号分隔的整数,不匹配匹配重复并且不匹配以零开头的数字(009,09,00 ...)您能否给我您经验丰富的意见,也许您看到了一个错误,或者您会以不同的方式编写一些东西(或所有东西)?谢谢
  • @TornikeShavishvili 你正走向一条死胡同。 为什么你不使用我的模式?
  • @TornikeShavishvili ^(?!.*\b(\d+)\b.*\b\1\b)([1-9]\d*|0)(?:,[1-9]\d*|,0)*$ 是一个很好的模式,它比我的需要更多的步骤,因为有交替组。分组结构内部的交替总是会消耗一些额外的计算能力。但是,由于模式匹配不同的字符串,因此您不应该比较它们的性能。你知道,我们只比较苹果和苹果。
猜你喜欢
  • 2011-08-13
  • 2016-12-05
  • 1970-01-01
  • 2022-12-10
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
相关资源
最近更新 更多