PostgreSQL正则表达式仅识别特殊字符

时间:2018-10-02 08:28:49

标签: regex postgresql

我试图弄清楚如何识别表中包含特殊字符但不包含空格的任何行。

原因是我正在查看名字字段的数据质量,并希望标识具有特殊字符(例如(-,. etc))的任何行

以下内容几乎标识了我所需要的内容,但也带了一些空格(乔尔·史密斯),这些空格不应该包含在内。

@for (int i = 1; i <= pageCount; i++)
{
    <li>
        <a href="/movesearchresult?page=@i&query=@searchQuery">Page @i</a>
    </li>
}

非常感谢

1 个答案:

答案 0 :(得分:0)

Postgres正则表达式似乎不支持否定先行,这是我们可以在此处使用的一种选择。取而代之的是,我们可以使用以下模式来表达您的匹配要求:

^[^\- ]*[^\-a-z0-9 ][^\- ]*$

这表示要匹配任意数量的非空格/连字符,后跟一个非字母/空格/连字符,再接着是任意数量的非空格/连字符。在Postgres中将变为以下内容:

^[^\-[:space:]]*[^\-a-z0-9[:space:]][^\-[:space:]]*$

这是一个示例查询:

WITH yourTable AS (
    SELECT 'abc' AS col UNION ALL
    SELECT 'abc  '  UNION ALL
    SELECT 'abc $'  UNION ALL
    SELECT 'abc$'   UNION ALL
    SELECT 'a-bc'   UNION ALL
    SELECT 'a-bc  ' UNION ALL
    SELECT 'a-bc $' UNION ALL
    SELECT 'a-bc$'
)

SELECT *
FROM yourTable
WHERE col ~* '^[^\-[:space:]]*[^\-a-z0-9[:space:]][^\-[:space:]]*$';

abc$

Demo