我有一个带有三个REGEXP_SUBSTR()实例的DB2 v7r3 SQL SELECT语句,它们都具有相同的正则表达式模式字符串,每个字符串都提取三个组中的一个。
我想将第一个SUBSTR更改为REGEXP_REPLACE()以在没有匹配的情况下进行条件替换,以插入与CASE ... END的ELSE部分类似的默认值。但我不能让它发挥作用。我可以轻松使用CASE,但使用RegEx似乎更紧凑和高效。
例如,我有各种完整状态的食品容器尺寸说明:
最后两个在开头没有'nnX'部分,在这种情况下假定'1X'并且需要插入。
这是我当前的工作模式字符串:
^(?:(\d{1,3})(?:X))?((?:\d{1,4})(?:\.\d{1,3})?)(L|ML|PK|Z|)$
返回的组是:数量,大小和单位。
但只有第一组需要有条件的替换:
(?:(\d{1,3})(?:X))?
这个RexEgg webpage描述了(?=...)
算子,它似乎是我需要的,但我不确定。它位于我的DB2版本的operators列表中,但我无法使其工作。坦率地说,它比我的正则表达式知识要深一些,我甚至无法在我最喜欢的在线正则表达式测试器Regex101中使用它。
那么......有没有人有任何想法或建议......?谢谢。
试试这个(替换“数字后面没有X_or_digit”):
with t(s) as (values
'12X125'
, '6X350'
, '1X1500'
, '1500'
, '1125'
)
select regexp_replace(s, '^([\d]+(?![X\d]))', '1X\1')
from t;