如何解决正则表达式代表一定数量的数字
我需要从postgres中选择行,其中零件号的开头附近是三位数字(300-399)。我只需要一个匹配/不匹配。
我主要在:
WHERE name ~ '^[A-Z]{0,5}3[0-9]{2}[^0-9]?*'
零件编号
- 只能是3位数长,
- 数字前最多可以包含5个字符
- 数字后面可以有字符
- 必须排除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)
负向查找,断言直接在右边的不是数字
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。