Db2 我可以写一个只需要不匹配部分的PCRE条件吗?

Db2 我可以写一个只需要不匹配部分的PCRE条件吗?,db2,db2-400,icu,Db2,Db2 400,Icu,我试图创建一个正则表达式来确定字符串是否包含SQL语句的数字。如果该值是数值,则我希望向其添加1。如果数字不是数字,我想返回1。或多或少以下是SQL: SELECT field, CASE WHEN regexp_like(field, '^ *\d*\.?\d* *$') THEN dec(field) + 1 ELSE 1 END nextnumber FROM mytable 这实际上是可行的,并返回如下内容: INVALID 1 0000

我试图创建一个正则表达式来确定字符串是否包含SQL语句的数字。如果该值是数值,则我希望向其添加1。如果数字不是数字,我想返回1。或多或少以下是SQL:

SELECT 
   field,
   CASE
     WHEN regexp_like(field, '^ *\d*\.?\d* *$') THEN dec(field) + 1
     ELSE 1
   END nextnumber
FROM mytable
这实际上是可行的,并返回如下内容:

INVALID     1
00000       1
00001E      1
00379       380
00013       14
99904       99905
但是为了突破理解的极限,如果我想涵盖负数,或者是带正号的数字呢。标志必须紧跟在数字之前或之后,但不能同时紧跟在数字之后,我不想在标志和数字之间留空白

我提出了一个带有捕获组的条件表达式,用于捕获数字前面的符号,以确定是否允许在末尾使用符号,但考虑到我并不真正需要“是”模式,处理起来似乎有点尴尬

下面是修改后的正则表达式:
^([+-]?)*\d*\.?\d*(?(1)*|[+-]?*)$

这在工作,但为了使其工作,我需要在管道之前有一些东西,因此我必须在
是模式
否模式
中复制下一个模式

这个问题的所有背景:我如何避免重复



EDIT:DB2fori使用Unicode的国际组件来提供正则表达式处理。原来这个库不支持像PRCE这样的条件,所以我更改了这个问题的标记。Wiktor Stribiżew给出的答案提供了一个条件的工作替代方案,使用了一个负前瞻。

您不必复制结束模式,只需将其移到条件之外:

^ *([+-])?\d*\.?\d*(?(1)|[+-]?) *$
看。因此,yes部分为空,no部分具有可选模式

您也可以通过简单的消极前瞻来解决它:

^ *([+-](?!.*[-+]))?\d*\.?\d*[+-]? *$

看。在这里,
([+-](?!.[-+])?
匹配(可选)一个
+
-
后面没有任何0+字符,后面跟着另一个
+
-

这确实有助于我读到的前瞻/后瞻内容。这是我一直不太清楚的pcre的一部分。我找不到任何文件告诉我,它不应该工作,我只是无法使它工作。DB2fori使用InternationalComponentsforUnicode库提供正则表达式解析,因此条件应该可以工作,我就是找不到神奇的咒语。不过,消极的展望效果很好。