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

问题描述 投票:0回答:1

我正在尝试创建正则表达式来确定字符串是否包含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) *|[+-]? *)$

这在regex101.com起作用,但是为了使其工作,我需要在管道之前添加一些东西,因此我必须在yes-patternno-pattern中都复制下一个模式

此问题的所有背景:如何避免重复?

db2 pcre db2-400
1个回答
0
投票

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

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

请参见regex demo。因此,yes部分为空,no部分具有可选模式。

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

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

请参见another regex demo

© www.soinside.com 2019 - 2024. All rights reserved.