测试正常时,正则表达式无法正常工作

时间:2019-01-21 11:45:58

标签: sql regex postgresql

对于我的数据库,我有一个公司编号列表,其中一些以两个字母开头。我创建了一个正则表达式,应该从查询中消除这些正则表达式,根据我的测试,它应该。但是执行后,结果仍然包含带有字母的数字。

这是我的正则表达式,我已经在https://www.regexpal.com上对其进行过测试

([^A-Z+|a-z+].*)

我已经针对SC08093,ZC000191和NI232312等众多版本进行了测试,这些版本不匹配,并且在测试中不存在,这很好。

我的sql查询看起来像;

SELECT companyNumber FROM company_data 
WHERE companyNumber ~ '([^A-Z+|a-z+].*)' order by companyNumber desc

总结一下,SC08093之类的字符串不应以字母开头。

我已经阅读了postgres的文档,但似乎找不到任何相关信息。我不确定我在这里缺少什么。谢谢。

3 个答案:

答案 0 :(得分:4)

~ '([^A-Z+|a-z+].*)'不起作用,因为这是[^A-Z+|a-z+].*的正则表达式匹配操作,即使在 partial 匹配时也返回true(正则表达式匹配操作不需要完整的字符串匹配,因此该模式可以匹配字符串中的任意位置)。 [^A-Z+|a-z+].*匹配一个从AZ的字母,+, | or a letter from a to z`,然后匹配任意零个或多个字符,在字符串中的任何地方。

您可以使用

WHERE companyNumber NOT SIMILAR TO '[A-Za-z]{2}%'

请参见online demo

此处,NOT SIMILAR TO返回SIMILAR TO操作的反结果。该SIMILAR TO运算符接受的模式几乎是正则表达式模式,但也类似于常规通配符模式。 NOT SIMILAR TO '[A-Za-z]{2}%'表示不返回以两个ASCII字母([A-Za-z]{2})开头且后跟(%)的所有记录,而将返回所有其他记录。请注意,SIMILAR TO需要与LIKE相同的完整字符串。

答案 1 :(得分:2)

不可以以字母开头

WHERE company ~ '^[^A-Za-z].*'

demo: db<>fiddle

第一个^标志着开始。 [^A-Za-z]说“没有字母”(包括小写和大写字母)。


编辑:将[A-z]更改为更精确的[A-Za-z]Why is this regex allowing a caret?

答案 2 :(得分:2)

您的模式:[^A-Z+|a-z+].*的意思是“至少有一些字符不是AZ的字符串”-为了将其扩展到整个字符串,您需要使用锚定的正则表达式,如S-Man所示(定义的组(..)并没有必要)

我可能会使用一个正则表达式指定所需的有效模式,然后使用!~

where company !~ '^[0-9].*$'

^[0-9].*$表示“仅由数字组成”,而!~表示“不匹配”

where not (company ~ '^[0-9].*$')