【问题标题】:Regular expression - matching inside a string正则表达式 - 在字符串内匹配
【发布时间】:2015-09-30 07:34:15
【问题描述】:

我一直在尝试找到一个正则表达式来匹配以下表达式中的数字,但我需要某个组。

例如:

Vdsl 1.10.4

如何匹配10

我还需要一个匹配 4

的表达式

P.S 我使用正则表达式风格的 Oracle SQL 函数 regex_substr()

谢谢


编辑:

我想我找到了解决方法:

  • 使用 REGEXP_SUBSTR() 您可以将其与点匹配:'.10.'然后使用 REGEXP_REPLACE 可以提取数字。

    REGEXP_REPLACE(REGEXP_SUBSTR('Vdsl 1.10.4','.\d+.'), '.(\d+).', '\1')

  • 最后一个数字

    REGEXP_REPLACE(REGEXP_SUBSTR('Vdsl 1.10.4','.\d+$'), '.(\d+)', '\1')

【问题讨论】:

  • 没有点。应该是 10

标签: regex oracle


【解决方案1】:

SQL Fiddle

Oracle 11g R2 架构设置

查询 1

WITH DATA AS (
  SELECT 'Vdsl 1.10.4' AS str
  FROM   DUAL
)
SELECT SUBSTR( REGEXP_SUBSTR( str, '\.\d+', 1, 1 ), 2 ) AS FIRST_NUMBER,
       SUBSTR( REGEXP_SUBSTR( str, '\.\d+', 1, 2 ), 2 ) AS SECOND_NUMBER
FROM   DATA

Results

| FIRST_NUMBER | SECOND_NUMBER |
|--------------|---------------|
|           10 |             4 |

【讨论】:

    【解决方案2】:

    由于 10 在 2 点之间,您可以使用 \.(\d+)\.,而对于 4,因为它在 1 点之后并且最后您可以使用 \.(\d+)$

    您可以使用适当的函数并提取第一组,即您的号码。如果您不能或不想获得该组,您可以使用look-around

    (?<=\.)\d+(?=\.)
    

    阅读更多关于基本正则表达式http://www.regular-expressions.info/

    【讨论】:

    • 是的,但是我应该如何删除前导点和尾随点?
    • @lindusilois 我对 Oracle 不熟悉。您可以尝试其中一种方式或搜索更多信息。
    【解决方案3】:

    你可以使用一个非常非常简单的正则表达式:

    (?=\.([0-9]+))
    

    最后一个:

    ([0-9]+)$
    

    【讨论】:

    • Oracle SQL 不支持lookbehind
    • @lindusilois 是否支持-ahaed
    • @lindusilois 尝试:\.([0-9]+)\.
    • 这包括点,但我不想要它们
    • @lindusilois 好的,试试:[0-9]{2}
    猜你喜欢
    • 2012-06-05
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多