我正在尝试编写一个查询(Postgres 8.2.15),它正在检查 column1 中的值是否包含:
- 仅限英文字母(AZ),不应包含来自西班牙语、阿拉伯语、德语等的变音/变音符号的特定字符。
- 允许使用单个空格、点、破折号、和号、撇号、括号和管道。
我有以下代码,它适用于空格、点和破折号,但是当我将其他一些符号插入到列表中时,查询没有产生正确的结果:
select
column1,
case
when column1 !~ '^.*[^A-Za-z0-9 .-].*$'
then 'ok'
else 'not ok'
end as "check",
from
table1
如何使用&、撇号、括号和管道扩展列表?
你的SQL如下:
这会更好地写成
因此,只有带有字母、数字和空格、句号(句点)和连字符的 ASCII 字符串。
您可以查看下面的长版本,但如果您想必须
ampersand, apostrophe, brackets and pipes
被允许。- 只需使用 (\
) 反斜杠转义字符 - 您可以将上面的模式更改为:双撇号是为了进一步转义它,因为它是模式分隔符。
我创建了一个如下表(下面的所有代码都可以在此处的小提琴中找到- 它是 9.5 - 这是我能找到的最旧的版本):
然后输入一些数据如下:
现在,您的原始模式是
'^.*[^A-Za-z0-9 .-].*$'
这样的,我将使用该SUBSTRING()
函数运行它。出现在哪里的字符串将false
用于!~
模式匹配运算符 - 如果您拼出字符串,有时会更清楚!结果:
因此,该模式正在做的是挑选出所有不是字母数字(ASCII 字母)的字符,然后返回整个字符串 - 这是因为之前和之后
^.*
的所有内容。.*$
如果您不想要管道和支架,可以执行以下操作:
结果:
因此,我们可以看到,现在唯一匹配该模式的字符串是包含阿拉伯字符、
á
(锐音字符)、中文字符和德语变音符号的字符串。现在消除了
&
,|
,$
和*
括号字符 - 这是通过\
在它们之前放置转义反斜杠 ( ) 字符来完成的(除了&
不是正则表达式元字符- 或特殊字符)。现在,有
\w
元字符类(也称为速记类)——它代表单词——结果:
除了
NULL
中文字符——阿拉伯语、a 和德文都被淘汰了——只有中文需要处理。于是,我查了一下,发现这个提示\u4e00-\u9fa5
单挑汉字的页面我决定看一下日语 - 这是日语,谢谢:
有り難う
。我也去了这里——得到了手假名/平假名的代码......
所以,最终的代码是
结果:
现在,从您的问题中还不清楚您希望返回的具体内容是什么 - 您似乎不太希望一切正常。
这是我的几个试验的另一个小提琴- 看看它们并确保你理解发生了什么 - 正则表达式非常强大,但它们也很棘手 - 很难弄清楚到底发生了什么!