正则表达式用于文本块中的前8位数字,但不包括数字大于8位的数字

时间:2018-11-15 19:17:21

标签: regex

我需要检查电子邮件中的某个文本块,以找到正好8位数字的数字,并且只返回第一个匹配项。

这是我的测试用例:

  

Test123456789-应该失败,因为9位数字

     

Test23456789Test-通过

     

Test23456789测试-通过

     

13456780测试-通过

     

Test0123456-因7位数字而失败

     

电子邮件中的其他文字:我已附上您要求的信息。如果您有任何问题,请告诉我们。 -电子邮件中的多余文本无关紧要。

我尝试过:
        .*(\d{8}).*-匹配倍数
        .*?(\d{8}).*-仅匹配一次,但也匹配9位数字
       .*(?<!\d)\d{8}(?!\d).*-我在另一个答案中找到了答案,但是它返回了电子邮件中的所有文本,我只想要8位数字。

谢谢您的指导!

4 个答案:

答案 0 :(得分:0)

您可以使用以下正则表达式:

(?!.*\d{9})\d{8}

首先使用negative look ahead表示9位数字。然后它匹配8 digits

如果是7位或9位数字,则失败。

答案 1 :(得分:0)

对您发布的最新版本进行一些细微调整:

尝试:.*(?<!\d)(\d{8})(?!\d).*

Demo

答案 2 :(得分:0)

您可以使用以下方法找到第一个匹配项:

^[\s\S]+?(?<!\d)(\d{8})(?!\d)

这将匹配:

  • ^声明字符串的开头
  • [\s\S]+?匹配任何不贪心的字符
  • (?<!\d)后面的否定性检查是不是数字
  • (\d{8})分组捕获8位数字
  • (?!\d)负向查找以检查右边的数字不是数字

或启用使点与您的工具或语言中的换行符匹配,或在正则表达式前加上(?s),然后将[\s\S]+?替换为.+?

您的值在第一个捕获组中。

Regex demo

答案 3 :(得分:0)

正如其他人所说,您可以使用否定的前瞻性和否定的后瞻性,并记住不要包含g标志,否则将匹配每次出现的模式:

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

Demo (global match)