正则表达式代表一定数量的数字

问题描述

我需要从postgres中选择行,其中零件号的开头附近是三位数字(300-399)。我只需要一个匹配/不匹配。

我主要在:

WHERE name ~ '^[A-Z]{0,5}3[0-9]{2}[^0-9]?*'

零件编号

  1. 只能是3位数长,
  2. 数字前最多可以包含5个字符
  3. 数字后面可以有字符
  4. 必须排除4位数字

这些应该匹配:

  • 323
  • A335
  • AB359-B2
  • BB311BB

这些不应该匹配:

  • 3234
  • A3357
  • AB3590-B

以上所述,“应匹配”通过,但“不匹配”通过。看起来,检查非数字([^ 0-9]?)的问号允许数字通过,但由于简单的3位数部件号不匹配,因此我不能要求它。

谢谢!

解决方法

此正则表达式通过了所有测试。

 '^[^\d]{0,5}\d{1,3}(\y|[^\d])'

第一个插入符号^锚定到起点。

[^\d]{0,5}最多允许五个非数字字符。

\d{1,3}允许一个到三个数字字符。

(\y|[^\d])替换匹配非数字字符或单词边界(例如字符串的结尾)。

,

您尝试过的模式也可能将字符串中的前3位与4位数字匹配,因为末尾的字符类是可选的[^0-9]?

如果您不将其设置为可选的[^0-9],则它将不会与唯一的323匹配,因为在其后应该有一个字符,它是除数字以外的任何字符。


如果数字后面可以有字符,但不能包含数字,则可以使用负号(?!\d)来在右边不声明数字。

^[A-Z]{0,5}3[0-9]{2}(?!\d)

说明

  • ^字符串的开头
  • [A-Z]{0,5}匹配0-5次字符A-Z
  • 3[0-9]{2}匹配3和2位数字
  • (?!\d)负向查找,断言直接在右边的不是数字

Regex demo | Postgresql demo

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...