【问题标题】:Regex to get everything between a dot and a space regexp_substr正则表达式获取点和空格之间的所有内容 regexp_substr
【发布时间】:2019-04-02 16:23:03
【问题描述】:

在 Oracle 数据库中,我有一个字符串,例如 12.13 this is a test。使用 regexp_substr 我试图只提取13。那是点之后和空格之前的数字。我尝试了各种组合,(string, '\.[0-9]{1,}') 最接近,但我仍然得到.13。有什么办法只返回13

数据还包括1.1 等项目。最多数字会是99.99

所有可能的数字格式为:#.##.####.###.##

【问题讨论】:

  • 感谢 RedRaven。难道所有的数字都有小数。还是只有一些?
  • @alexgibbs:请参阅编辑以了解可能的格式。所有数字都有小数。我想要小数点后的所有内容,但不是小数点。
  • @RedRaven 从纯正则表达式的角度来看,您需要一个积极的后视,但是,Oracle 似乎不支持此功能,正如所讨论的 here
  • 在您需要的数字之后是否总是有一个空格,或者数字(如您的示例中的 12.13)是否位于字符串的末尾,因此 13 之后就没有空格?跨度>

标签: oracle regexp-substr


【解决方案1】:

鉴于输入字符串总是有前导数字和一个点,可以使用regexp_substr 提取小数。 regexp_replace 也可以使用。

以下是regexp_substr 的一些示例。这些通过包含一个针对所需数据的捕获组和一个subexpression 参数(regexp_substr 中的最后一个参数)来工作:

SELECT REGEXP_SUBSTR('12.13 this is a test','^[0-9]{1,}[.]{1}([0-9]{1,})',1,1,NULL,1) AS FRACTIONAL FROM DUAL;

结果:

FRACTIONAL
13

1 row selected.

SELECT REGEXP_SUBSTR('1.1 this is a test','^[0-9]{1,}[.]{1}([0-9]{1,})',1,1,NULL,1) AS FRACTIONAL FROM DUAL;

结果:

FRACTIONAL
1

1 row selected.

SELECT REGEXP_SUBSTR('99.99 this is a test','^[0-9]{1,}[.]{1}([0-9]{1,})',1,1,NULL,1) AS FRACTIONAL FROM DUAL;

结果:

FRACTIONAL
99

1 row selected.

【讨论】:

    【解决方案2】:

    对于此类任务,我更喜欢 regexp_replace 而不是 regexp_substr

    regexp_replace(str, '^.*?\.([[:digit:]]+).*$', '\1');
    

    即从头开始查找 wohle 字符串,包含一些字符、一个点、一些数字、一些字符,直到结束,但只记住数字并返回这些数字而不是字符串。

    但我想这只是个人喜好问题。

    【讨论】:

      【解决方案3】:
      select regexp_substr('12.13 this is a test', '\d+\.(\S+)', 1, 1, null, 1) rs
      from dual;
      
      RS
      --
      13
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多