对于我的数据库,我有一个公司编号列表,其中一些以两个字母开头。我创建了一个正则表达式,应该从查询中消除这些正则表达式,根据我的测试,它应该。但是执行后,结果仍然包含带有字母的数字。
这是我的正则表达式,我已经在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的文档,但似乎找不到任何相关信息。我不确定我在这里缺少什么。谢谢。
答案 0 :(得分:4)
~ '([^A-Z+|a-z+].*)'
不起作用,因为这是[^A-Z+|a-z+].*
的正则表达式匹配操作,即使在 partial 匹配时也返回true(正则表达式匹配操作不需要完整的字符串匹配,因此该模式可以匹配字符串中的任意位置)。 [^A-Z+|a-z+].*
匹配一个从A
到Z
的字母,+,
| 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].*'
第一个^
标志着开始。 [^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].*$')