代码之家  ›  专栏  ›  技术社区  ›  Boris Grunwald

匹配十六进制和整数的正则表达式[重复]

  •  0
  • Boris Grunwald  · 技术社区  · 6 年前

    例如,下面的正则表达式

    /^([0-9]+|\.[0-9]+)$/
    

    将匹配

    234
    

    .56
    

    234.56
    

    而下面的正则表达式

    /^([0-9]+)?(\.[0-9]+)?$/
    

    将匹配上面三个字符串,但它也将匹配空字符串,这是我们不想要的。

    我需要的东西,将匹配以上三个字符串,但不是空字符串。有什么简单的方法吗?

    下面的Andrew和Justin都在为我提供的简化示例工作,但是它们不适用于我希望解决的实际用例(除非我弄错了),所以我现在应该把它放进去。以下是我使用的实际regexp:

    /^\s*-?0*(?:[0-9]+|[0-9]{1,3}(?:,[0-9]{3})+)(?:\.[0-9]*)?(\s*|[A-Za-z_]*)*$/
    

    这会匹配的

    45
    45.988
    45,689
    34,569,098,233
    567,900.90
    -9
    -34 banana fries
    0.56 points
    

    .56个
    

    我需要它来做这个。

    0 回复  |  直到 12 年前
        1
  •  34
  •   huon John U    12 年前

    完全通用的方法,给定正则表达式 /^A$/ /^B$/ 是:

    /^(A|B|AB)$/
    

    /^([0-9]+|\.[0-9]+|[0-9]+\.[0-9]+)$/
    

    [0-9]* [0-9]+ 左右两边的因素。

    为此所做的工作是:

    • 交替的所有元素都以 [0-9]+ ,所以把它拔出来: /^(|\.|[0-9]+\.)[0-9]+$/
    • 现在我们有可能在交替中使用空字符串,所以使用 ? (|a|b) = (a|b)? /^(\.|[0-9]+\.)?[0-9]+$/
    • 同样,一个带有共同后缀的交替( \. 这次): /^((|[0-9]+)\.)?[0-9]+$/
    • 模式 (|a+) a* ,所以,最后: /^([0-9]*\.)?[0-9]+$/
        2
  •  5
  •   Andrew Logvinov    12 年前

    是的,您可以用这样一个表达式来匹配所有这些:

    /^[0-9]*\.?[0-9]+$/
    

    注意,它也与空字符串(最后一个条件)不匹配。

        3
  •  4
  •   Community holdenweb    4 年前

    ? .

    /^(?=.)([0-9]+)?(\.[0-9]+)?$/
    

    上面的看起来有点尴尬,但我想给你展示一些你的确切图案 ? s扔进去了。在这个版本中, (?=.) 确保它不接受空字符串,因为我将这两个子句都设置为可选。更简单的版本是:

    /^\d*\.?\d+$/
    

    这满足了您的要求,包括防止出现空字符串。

    请注意,表达这一点有很多种方式。有些很长,有些很简洁,但是 they become more complex depending on what you're trying to allow/disallow

    编辑:

    如果您想在一个更大的字符串中匹配它,我建议您使用 /^\d*\.?\d+$/ aaa.123.456.bbb 或者找不到火柴(相信我,你会的。JavaScript缺少lookbehind支持,这确保了它可以打破我能想到的任何模式)。

    如果你知道你不会得到像上面这样的字符串,你可以用分词代替 ^$ . (一个空格)。

    /(\b\d+|\B\.)?\d*\b/g
    

    aaa123.456bbb ,但它允许 123 , 456 123.456 . 它将允许 ,但正如我所说,如果你想全面地处理这个问题,你需要两个步骤。

    编辑2:你的用例

    如果你想在开头加空格,在结尾加上正负号和单词,这些实际上是相当严格的规则。这是件好事。您可以将它们添加到上面最简单的模式中:

    /^\s*[-+]?\d*\.?\d+[a-z_\s]*$/i
    

    /^\s*[-+]?(\d+|\d{1,3}(,\d{3})*)?(\.\d+)?\b(\s[a-z_\s]*)?$/i
    

    这个 \b 确保数字部分以数字结尾,并且后面至少有一个空格。

        4
  •  2
  •   Kal    5 年前

    huon的回答不错(还有一点脑筋急转弯,一直到最后)。对于任何想要快速简单地回答这个问题的人来说,'在正则表达式中, 匹配一件事或另一件事,或两者兼而有之 '值得一提的是,即使(A | B | AB)也可以简化为:

    A|A?B
    

        5
  •  0
  •   Heinz Kessler    8 年前

    也许这有助于(给你一个大概的想法):

    (?:((?(digits).^|[A-Za-z]+)|(?<digits>\d+))){1,2}
    

    此模式匹配字符、数字或字符后的数字,但不匹配数字后的字符。 不要被“^”这个词所迷惑,它的意思是“一个字符后面跟着一行开始”,它的目的是阻止任何匹配。

    请注意,这并不适用于所有类型的regex,您的regex版本必须支持 (?(named group)true|false) .