我正在尝试创建正则表达式来确定字符串是否包含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-pattern
和no-pattern
中都复制下一个模式。
此问题的所有背景:如何避免重复?
您不必复制结束模式,只需将其移至条件之外:
^ *([+-])?\d*\.?\d*(?(1)|[+-]?) *$
请参见regex demo。因此,yes部分为空,no部分具有可选模式。
您也可以通过消极的前瞻来解决它:
^ *([+-](?!.*[-+]))?\d*\.?\d*[+-]? *$