【问题标题】:REGEXP_REPLACE for exact regex pattern, not workingREGEXP_REPLACE 用于精确的正则表达式模式,不起作用
【发布时间】:2019-10-27 04:39:06
【问题描述】:

我正在尝试使用下面的代码匹配一个精确的模式来为 ISSN 做一些数据清理:

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

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

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

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

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

1234-5678 
1234-567X 
12345678 
1234567X

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

1234567899
1234567899x

我错过了什么?

【问题讨论】:

  • 试试^([0-9]{4}-?[Xx0-9]{4})([^0-9].*)?$。顺便说一句,将[\-]? 替换为-?
  • 完美,有效!谢谢你。我确实需要它来识别可能的空格和破折号,所以我这样做了:^([0-9]{4}[\\s|\-]?[Xx0-9]{4})([^0-9].*)?

标签: regex amazon-redshift regexp-replace


【解决方案1】:

你可以使用

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

regex demo

详情

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多