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

Can I write a PCRE conditional that only needs the no-match part?

我正在尝试创建一个正则表达式来确定字符串是否包含 SQL 语句的数字。如果该值是数字,那么我想给它加 1。如果数字不是数字,我想return一个1。或多或少。这是 SQL:

SELECT 
   field,
   CASE
     WHEN regexp_like(field, '^ *\d*\.?\d* *$') THEN dec(field) + 1
     ELSE 1
   END nextnumber
FROM mytable

这确实有效,return是这样的:

INVALID     1
00000       1
00001E      1
00379       380
00013       14
99904       99905

但是为了推动理解的极限,如果我想涵盖负数或带有正号的数字怎么办。符号必须紧跟在数字之前或之后,但不能同时出现在这两个数字之后,我不想在符号和数字之间使用白色 space。

我想出了一个带有捕获组的条件表达式来捕获数字前面的符号以确定末尾是否允许符号,但处理起来似乎有点尴尬,因为我不这样做真的需要一个肯定的模式。

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

这适用于 regex101.com,但为了让它工作,我需要在管道之前有一些东西,所以我必须 复制下一个模式 yes-patternno-pattern

这个问题的所有背景:我怎样才能避免重复?


编辑: DB2 for i 使用 International Components for Unicode 来提供正则表达式处理。原来这个库不支持像PRCE这样的条件语句,所以我改了这个问题的标签。 Wiktor Stribiżew 给出的答案通过使用否定先行提供了条件的工作替代方案。

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

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

参见regex demo。所以,是的部分是空的,否的部分有一个可选的模式。

你也可以通过消极的前瞻来解决它:

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

参见another regex demo。在这里,([+-](?!.*[-+]))? 匹配(可选)+- 后跟任何 0+ 字符后跟另一个 +-.