首页 > 解决方案 > 具有不同数字、可选字母和点的数字的混合正则表达式

问题描述

我正在为手持扫描设备开发一个 Android 应用程序,该应用程序应该扫描不同类型的 QR 码;这些二维码可以包含不同的数字、字母、圆点和加号;由于我不是正则表达式的专家,因此非常感谢任何提示或帮助。

正则表达式应匹配以下数字、字母、点和加号的出现:

1256+70

1235.B+70

1256+70+DB

1235.B+70+DB

1256+70+DB2020-123

1235.B+70+DB2020-123

1256+0+DB2020-123

1235.B+0+DB2020-123

前四位数字范围可以是[100-99999].[AZ]

我想出了以下正则表达式

    [0-9]{4}

    [0-9]{3,6}$.?[A-Z]?+[0-9]+DB[0-9]{4}-[0-9]]

    [0-9]{3,6}$.?[A-Z]?+[0-9]

    [0-9][0-9][0-9][0-9].[0-9][0-9].+DB

    \b\d{3,6}\b

    [0-9]{3,6}$.?[A-Z]?+[0-9]+DB[0-9]{4}-[0-9]]

    [0-9]{3,6}$.?[A-Z]?+[0-9]

    [0-9]{3,6}$.?[A-Z]?+[0-9]

但它们并没有涵盖所有可能的组合并且错过了很多选项 - 因此非常感谢任何帮助或提示 - 在此先感谢!

标签: javaandroidregex

解决方案


查看示例数据,一种选择可能是使用 1 个带有特定和可选部分的正则表达式:

^[1-9]\d{2,4}(?:\.[A-Z])?\+\d+(?:\+DB(?:\d{4}-\d{3})?)?$
  • ^字符串的开始
  • [1-9]\d{2,4}匹配从 100 到 99999
  • (?:\.[A-Z])?可选匹配.和字符 AZ
  • \+\d+匹配+和 1+ 位(或用于\d{1,2}匹配 1 位或 2 位数字)
  • (?:非cpature组
    • \+DB(?:\d{4}-\d{3})?匹配+和 DB 并可选择匹配 4 位-和 3 位
  • )? 关闭非捕获组并使其可选
  • $字符串结束

正则表达式演示

在 Java 中

String regex = "^[1-9]\\d{2,4}(?:\\.[A-Z])?\\+\\d+(?:\\+DB(?:\\d{4}-\\d{3})?)?$";

推荐阅读