我想使用字符串中的正则表达式函数在第二个点(。)之前提取文本,例如:

Posted

技术标签:

【中文标题】我想使用字符串中的正则表达式函数在第二个点(。)之前提取文本,例如:【英文标题】:I want to extract text before second dot(.) using regexp function from string like : 【发布时间】:2021-02-08 07:45:36 【问题描述】:

我想从字符串中提取第二个点(。)之前的文本:

Input - XYZ.ABC.MNO.CZ 
Output- XYZ.ABC
Input - AWQ.QA
Output- AWQ.QA

【问题讨论】:

【参考方案1】:

看起来你想要除了点之外的任何东西,然后是点,然后是除了点之外的任何东西:

with t (v) as (
  select 'XYZ.ABC.MNO.CZ' from dual union all
  select 'AWQ.QA' from dual
)
select regexp_substr(v,'[^\.]+\.[^\.]+') from t;

【讨论】:

@BarbarosÖzhan 在这种情况下是的,正如我(令人惊讶地)观察到的那样。我决定保留反斜杠,以免给其他正则表达式引擎或其他分隔符带来不好的例子。【参考方案2】:

使用SUBSTR + INSTR 组合(在大型数据集上可能比正则表达式表现更好):

SQL> with test (col) as
  2    (select 'XYZ.ABC.MNO.CZ' from dual union all
  3     select 'AWQ.QA' from dual
  4    )
  5  select col,
  6         substr(col, 1, case when instr(col, '.', 1, 2) = 0 then length(col)
  7                             else instr(col, '.', 1, 2) - 1
  8                        end
  9               ) result
 10  from test;

COL            RESULT
-------------- --------------
XYZ.ABC.MNO.CZ XYZ.ABC
AWQ.QA         AWQ.QA

SQL>

【讨论】:

【参考方案3】:

此正则表达式处理点分隔字符串的元素为 NULL 的情况。基本上匹配任何东西,一个文字点,然后是后面跟着一个文字点或字符串结尾的任何东西。返回第一组。请注意,如果未找到匹配项,REGEXP_SUBSTR 将返回 NULL(REGEXP_REPLACE 返回原始字符串)。

See this post for more info on why using the REGEX form '[^.]+' does not always work as expected for parsing strings.

WITH T (ID, v) AS (
  SELECT 1, 'XYZ.ABC.MNO.CZ' FROM dual UNION ALL
  SELECT 2, '.ABC.MNO.CZ' FROM dual UNION ALL
  SELECT 3, 'XYZ..MNO.CZ' FROM dual UNION ALL    
  SELECT 4, 'AWQ.QA' FROM dual
)
SELECT ID, REGEXP_SUBSTR(v,'(.*?\..*?)(\.|$)', 1, 1, NULL, 1) substring
FROM T
ORDER BY ID;


        ID SUBSTRING     
---------- --------------
         1 XYZ.ABC       
         2 .ABC          
         3 XYZ.          
         4 AWQ.QA        

4 rows selected.

始终使用数据中的意外情况进行测试。

【讨论】:

以上是关于我想使用字符串中的正则表达式函数在第二个点(。)之前提取文本,例如:的主要内容,如果未能解决你的问题,请参考以下文章

批处理正则表达式怎样替换第二个指定字符

捕获第二个引用的字符串,不带尾随引号/分隔符

如何在Java中将字符串子串到第二个点(。)?

ES6学习总结之 正则表达式

正则表达式之制作地址取址器

REGEX - 在字符串之间查找文本 - 第一个可选,但在第一个匹配之前只有第二个