postgresql 接受中文字符,ascii &拒绝特殊字符的Sql regexp

zpf6vheq  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(228)

我需要一个满足以下条件的sql regexp模式。
1.接受中文字符,2.接受- a-z,A-Z,0-9,空格3.仅拒绝特殊字符。
我试过以下方法。

Select regexp_like((val)::TEXT , ('^[ !-’~¡-ÿ]*$')::TEXT)

      Or

regexp_like((瓦尔)::TEXT,('^[^[:ascii:]]+$')::text);
上面的查询也接受不应该接受的特殊字符。
SELECT(('#$$')::TEXT ~('^[a-zA-Z0-9]*$'));
此查询满足,但无法接受中文字符。

ojsjcaue

ojsjcaue1#

您可以使用中文字符的unicode值

SELECT (('#$$')::TEXT ~ ('^[a-zA-Z0-9\x4e00-\x9fff\x3400-\x4dbf]*$'));
41zrol4v

41zrol4v2#

根据 Wikipedia,中文字符在以下Unicode范围内,U+4 E00到U+9 FFF。* 维基百科-中日韩统一表意文字 .
此外,还有 * 扩展A到H

  • 中日韩统一表意文字扩展区A*,U+3400至U+4DBF。
  • 中日韩统一表意文字扩展区B*,U+20000至U+2A 6DF。
  • 中日韩统一表意文字扩展区C*,U+2A 700至U+2B 73 F。
  • 中日韩统一表意文字扩展区D*,U+2B 740至U+2B 81 F。
  • 中日韩统一表意文字扩展区E*,U+2B 820至U+2CEAF。
  • 中日韩统一表意文字扩展F*,U+2CEB 0至U+2 EBEF。
  • 中日韩统一表意文字扩展区G*,U+30000至U+3134 F。
  • 中日韩统一表意文字扩展区H*,U+31350至U+323 AF。

因此,您可以向字符类添加Unicode范围,如下所示。

  • “1.接受中文字符”*
[\u4e00-\u9fff]
  • “2.接受- a-z,A-Z,0-9,空格”*
  • (?i)* 将切换到 * 不区分大小写 * 模式。
(?i)[a-z\d \u4e00-\u9fff]
  • “3.仅拒绝特殊字符。"*

我想你提供的值,是你想拒绝的字符。
对于提供的范围,!到',您希望跳过数字字符 0到9 以及大写字母 A到Z
因此,需要将其更改为以下内容。

[^!-/:-@\[-`~¡-ÿ]

然后可以使用 character class intersection 语法 && 将此字符类添加到前一个。
因此,完整的模式如下所示。

(?i)^[a-z\d \u4e00-\u9fff&&[^!-/:-@\[-`~¡-ÿ]]*$

相关问题