【问题标题】:RegEx number not surrounded by other numbers正则表达式数字不被其他数字包围
【发布时间】:2011-05-12 21:33:51
【问题描述】:

我正在尝试获取一个不被任何其他数字包围且不在数字序列中的六位数字。这个数字可以存在于字符串的开头、字符串的任何位置以及结尾。它前面也可以有逗号和文本,但最重要的是不同的 6 位数字块。我已经把头发拉出来做前瞻和条件,找不到解决所有问题的完整解决方案。

样本数据:

00019123211231731订单号 761616 BR 地址 123 A ST
订单号。 760641 约翰·多伊
编号:订单 #761625
OP212312165 订单号 759699 /REC/YR 123 A ST
766911
761223,761224,761225

【问题讨论】:

    标签: php regex preg-match-all


    【解决方案1】:

    (^|\D)(\d{6})(\D|$)。您将在捕获组 2 中找到所需的 6 位数匹配项。请注意,此解决方案仅对一个匹配项可靠。它不会在123456,567890 中找到这两个数字(感谢 Alan 指出这一点!)。如果需要多个匹配项,则应使用环视解决方案。

    环视:

    (?<=^|\D)\d{6}(?=\D|$)

    或使用环视和条件为有效数字(即第一个数字不是 0):

    (?<=^|\D)[1-9]\d{5}(?=\D|$)

    【讨论】:

    • 这可能不是 100% 完成的。他表示他需要它们不在一个数字序列中。在这种情况下,我有点不确定他所说的序列是什么意思。
    • @Thomas 我认为他不希望序列的 6 位数部分超过 6。如果我错了,他可能会添加评论。
    • 很可能是这样,只是在思考它。我觉得奇怪的是,他没有用数字 AND 包围而不是在数字序列中。也许这只是强调的冗余,但我认为它可能意味着两个不同的东西。
    • 我不希望它以 00012373122300182 之类的序列匹配 731223。我忘记添加我已有的正则表达式:[1-9][0-9]{5}
    • 我会为此使用负面环视:(?<!\d)[1-9]\d{5}(?!\d)@Rob,您的负环视解决方案在两个方面被破坏:(1)环视应该在正则表达式的开头,并且(2) 感叹号应该放在 尖括号之后,即(?<!(?!<[\dA-Za-z]) 是一个否定的lookahead,用于尖括号后跟一个字母或数字。
    【解决方案2】:

    您可以使用 negative lookbehindnegative lookahead 来确保匹配项旁边没有数字:

    (?<!\d)\d{6}(?!\d)
    

    这个匹配数字,而不匹配相邻的字符。
    此外,如果匹配位于字符串的开头或结尾,它也有效。

    【讨论】:

    • 仅匹配 6 位数字在您无法使用命名捕获组时很有用,例如在 Notepad++ 中搜索时。
    【解决方案3】:

    你不能同样轻松地使用这个正则表达式

    [^0-9](\d{6})[^0-9]
    

    它应该匹配任何 6 位数字,而不是由任何其他数字填充。因此不在一个序列中。

    【讨论】:

    • 这会因字符串 012345 而失败。
    • 匹配不能重叠,所以你需要一个lookbehind和lookahead。示例:“zz123456,987654,234531xy”即使您的正则表达式仅捕获匹配实际上是“z123456”的数字,并且因为匹配不能重叠,987654 将被忽略,下一个匹配将是“,234531x”
    • 这匹配其他字符,例如,123456,
    猜你喜欢
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 2017-09-17
    • 2011-04-02
    • 2019-05-29
    相关资源
    最近更新 更多