You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写正则表达式匹配合法ISBN?修正现有匹配异常

修正正则以匹配合法ISBN

问题

现有C#代码中的正则表达式会匹配到无效的ISBN条目(比如带连续连字符的片段、格式错误的ISBN),需要修改正则以仅匹配符合标准的ISBN-10和ISBN-13。

输入示例

ISBN 978-5-317-04434-3
ISBN 978-5-93286-181-3
ISBN 5-272-00341-1
ISBN 5-272-00251-1

ISBN 5-272---00251--1

ISBN 0-12-345678-9

当前错误匹配结果

包含无效条目:272---00251、ISBN 0-12-345678-9

期望匹配结果

仅保留前4条合法ISBN。

问题根源

原正则的缺陷:

  • 未限制分隔符(连字符/空格)的连续出现,导致匹配到多分隔符的无效片段
  • 未严格约束ISBN-10(10位数字)和ISBN-13(13位数字,以978/979开头)的整体结构
  • 单词边界\b在数字与连字符组合中触发了部分匹配

解决方案

使用严格约束结构的正则,明确区分ISBN-13和ISBN-10的格式,同时禁止连续分隔符:

string pattern = @"\b(?:ISBN(?:-1[03])?:?\s*)?(?:(?:97[89][- ]?[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9X])|(?:[0-9][- ]?[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9X]))\b";

如果需要强制使用连字符作为分隔符(禁止空格),可以用这个版本:

string pattern = @"\b(?:ISBN(?:-1[03])?:?\s*)?(?:97[89]-[0-9]{1,5}-[0-9]+-[0-9]+-[0-9X]|[0-9]-[0-9]{1,5}-[0-9]+-[0-9X])\b";

说明

  • 匹配可选的ISBN前缀(ISBN、ISBN-10、ISBN-13,后跟可选的冒号和空格)
  • ISBN-13部分:以978/979开头,分段为前缀组-出版商标识符-书名标识符-校验码,各段间为单个连字符/空格
  • ISBN-10部分:以单个数字开头,分段为组标识符-出版商标识符-书名标识符-校验码(允许X作为校验码)
  • 整体用单词边界\b确保匹配完整的ISBN,避免部分匹配

验证结果

修改后正则仅匹配以下合法条目:

ISBN 978-5-317-04434-3
ISBN 978-5-93286-181-3
ISBN 5-272-00341-1
ISBN 5-272-00251-1

内容的提问来源于stack exchange,提问作者Versst

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 05:38:17