REGEXP_REPLACE 对于精确的正则表达式模式,不起作用

REGEXP_REPLACE for exact regex pattern, not working

我正在尝试匹配一个确切的模式,以便使用以下代码为 ISSN 做一些数据清理:

select case when REGEXP_REPLACE('1234-5678 ÿþT(zlsd?k+j''fh{l}x[a]j).,~!@#$%^&*()_+{}|:<>?`"\;''/-',  '([0-9]{4}[\-]?[Xx0-9]{4})(.*)', '') not similar to '[0-9]{4}[\-]?[Xx0-9]{4}' then 'NOT' else 'YES' end

我想要的模式匹配任何 8 位数字组,中间可能有破折号,最后可能有 X。

上面的代码适用于大多数情况,但如果捕获组 1 是以下示例:123456789 那么它也会 returns 正数,因为它匹配前 8 位数字,而我不想要它。

我尝试用 ^...$ 包围捕获组 1,但这也不起作用。

所以我想将这些示例和类似示例完全匹配:

1234-5678 
1234-567X 
12345678 
1234567X

但不是这些(和类似的):

1234567899
1234567899x

我错过了什么?

您可以使用

^([0-9]{4}-?[Xx0-9]{4})([^0-9].*)?$

regex demo

详情

  • ^ - 字符串开头
  • ([0-9]{4}-?[Xx0-9]{4}) - 捕获组 1 (</code>):四个数字,一个可选的 <code>-,然后是四个 x / X 或数字
  • ([^0-9].*)? - 可选的捕获组 2:除数字以外的任何字符,然后尽可能多的任何 0+ 个字符
  • $ - 字符串结尾。