【问题标题】:Match string that starts with 9 digits and possibly ends with string匹配以 9 位数字开头并可能以字符串结尾的字符串
【发布时间】:2012-09-13 06:34:25
【问题描述】:

我基本上是在尝试匹配 10 个字符的 ISBN,到目前为止,我能够匹配任何 10 个字符长的字符串,但在将字符串识别为 ISBN 时并不准确

一个 10 字符长的 isbn 可以有 9 个起始数字并以字母结尾或有 10 个数字, 例如

0273737025

027373702X

如果最后一个字符是字母,则始终为X

我目前所拥有的

[a-zA-Z0-9]{10,10}

这个正则表达式将能够从像

这样的字符串中提取 isbn
"asjdh - asd a -  dsa- 0273737025"  = 0273737025

但也会提取长度为 10 个或更多字符的任何其他内容

"asjdh - asd a -  dsa- myveryearly"  = myveryearl

有没有可以满足这些要求的正则表达式?

【问题讨论】:

  • "string" 可以包含数字和其他字符。您应该指定“字母”或类似的东西,例如“如果最后一个字符是字母……”
  • ISBN 有校验位,你不必在这里重新发明轮子
  • @Dagon 这与问题无关
  • “但将字符串识别为 ISBN 并不准确” 这正是校验位的用途
  • @Dagon 我的意思是它可以检测任何 10 个字符长的单词。

标签: php regex


【解决方案1】:
\d{9}(?:\d|X)

这是 9 位数字,后跟一个数字或“X”。

【讨论】:

    【解决方案2】:

    这应该可行:

    [0-9]{9}[xX0-9]
    

    或者更简洁的形式:

    \d{9}[xX\d]
    

    【讨论】:

      【解决方案3】:

      您必须使用后向查找来防止找到前面有更多数字的 9 位数字。

      (?<!\d)\d{9}[\dxX]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-07
        • 2021-11-06
        • 2014-01-15
        相关资源
        最近更新 更多