AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 294423
Accepted
ivailonmarinov
ivailonmarinov
Asked: 2021-06-18 02:03:39 +0800 CST2021-06-18 02:03:39 +0800 CST 2021-06-18 02:03:39 +0800 CST

使用 RegEx 查找特定字符的列表

  • 772

我正在尝试编写一个查询(Postgres 8.2.15),它正在检查 column1 中的值是否包含:

  1. 仅限英文字母(AZ),不应包含来自西班牙语、阿拉伯语、德语等的变音/变音符号的特定字符。
  2. 允许使用单个空格、点、破折号、和号、撇号、括号和管道。

我有以下代码,它适用于空格、点和破折号,但是当我将其他一些符号插入到列表中时,查询没有产生正确的结果:

select
    column1,
    case 
        when column1 !~ '^.*[^A-Za-z0-9 .-].*$'
        then 'ok' 
        else 'not ok' 
        end as "check",
from 
    table1

如何使用&、撇号、括号和管道扩展列表?

postgresql regex
  • 1 1 个回答
  • 1757 Views

1 个回答

  • Voted
  1. Best Answer
    Vérace
    2021-06-18T07:08:22+08:002021-06-18T07:08:22+08:00

    你的SQL如下:

    when column1 !~ '^.*[^A-Za-z0-9 .-].*$'
    

    这会更好地写成

    WHEN column1 !~ '[^A-Za-z0-9 .-]+'
    

    因此,只有带有字母、数字和空格、句号(句点)和连字符的 ASCII 字符串。

    您可以查看下面的长版本,但如果您想必须ampersand, apostrophe, brackets and pipes被允许。- 只需使用 ( \) 反斜杠转义字符 - 您可以将上面的模式更改为:

    WHEN column1 !~  '[^A-Za-z0-9&\(\)\| \''.-]+'
    

    双撇号是为了进一步转义它,因为它是模式分隔符。

    我创建了一个如下表(下面的所有代码都可以在此处的小提琴中找到- 它是 9.5 - 这是我能找到的最旧的版本):

    CREATE TABLE str_test
    (
      str TEXT NOT NULL
    );
    

    然后输入一些数据如下:

    INSERT INTO str_test VALUES
    ('$ff asfd &*$'), 
    ('xyz asfd abc'), 
    ('abc 1234 agg'), 
    ('adf اشكرك agg'),            -- Arabic characters 
    ('The essential thing is'),
    ('afda sfsáásfd sdfs'),       -- á - a acute
    ('afda sfs谢谢你 sfd sdfs'),  -- Chinese characters
    ('adf (((( &*$'), 
    ('adf ||| &*$'),
    ('Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz'), -- German word
    ('afasdfsdfdadfdsf fasfsafsdafasdfasfaadsf');
    

    现在,您的原始模式是'^.*[^A-Za-z0-9 .-].*$'这样的,我将使用该SUBSTRING()函数运行它。出现在哪里的字符串将false用于!~模式匹配运算符 - 如果您拼出字符串,有时会更清楚!

    SELECT 
      SUBSTRING (str, '^.*[^A-Za-z0-9 .-].*$') FROM str_test;
    

    结果:

    substring
    $ff asfd &*$
    NULL
    NULL
    adf اشكرك agg
    NULL
    afda sfsáásfd sdfs
    afda sfs谢谢你 sfd sdfs
    adf (((( &*$
    adf ||| &*$
    Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz
    NULL
    11 rows
    

    因此,该模式正在做的是挑选出所有不是字母数字(ASCII 字母)的字符,然后返回整个字符串 - 这是因为之前和之后^.*的所有内容。.*$

    如果您不想要管道和支架,可以执行以下操作:

    SELECT
      SUBSTRING (str, '^.*[^A-Za-z0-9&\* .\|\$\(-]') FROM str_test;
    

    结果:

    substring
    NULL
    NULL
    NULL
    adf اشكرك
    NULL
    afda sfsáá
    afda sfs谢谢你
    Rindfleischetikettierungsüberwachungsaufgabenü
    NULL
    11 rows
    

    因此,我们可以看到,现在唯一匹配该模式的字符串是包含阿拉伯字符、á(锐音字符)、中文字符和德语变音符号的字符串。

    现在消除了&, |,$和*括号字符 - 这是通过\在它们之前放置转义反斜杠 ( ) 字符来完成的(除了&不是正则表达式元字符- 或特殊字符)。

    现在,有\w元字符类(也称为速记类)——它代表单词——

    SELECT
      SUBSTRING (str, '[^\w &\.\-\$\|\(\)\*]') FROM str_test;
    

    结果:

    substring
    谢
    12 rows
    

    除了NULL中文字符——阿拉伯语、a 和德文都被淘汰了——只有中文需要处理。于是,我查了一下,发现这个提示\u4e00-\u9fa5单挑汉字的页面

    我决定看一下日语 - 这是日语,谢谢:有り難う。

    INSERT INTO str_test VALUES ('有り難う');
    

    我也去了这里——得到了手假名/平假名的代码......

    所以,最终的代码是

    SELECT
      SUBSTRING (str, '[^\u3000\u3400-\u4DBF\u4E00-\u9FFFぁ-んァ-ン\w &\.\-\$\|\(\)\*]') FROM str_test;
    

    结果:

    substring
    ...
    ... all NULL
    ...
    13 rows
    

    现在,从您的问题中还不清楚您希望返回的具体内容是什么 - 您似乎不太希望一切正常。

    这是我的几个试验的另一个小提琴- 看看它们并确保你理解发生了什么 - 正则表达式非常强大,但它们也很棘手 - 很难弄清楚到底发生了什么!

    • 2

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve