检索匹配模式之前的字符

时间:2019-01-11 10:24:30

标签: sql regex oracle

135 ;1111776698 ;AB555678765

我有上面的字符串,我要寻找的是在第一次出现;之前检索所有数字。

但是第一次出现;之前的字符数有所不同,即可以是4位数字或3位数字。

我玩过regex_instr和instr,但我无法弄清楚。

查询应返回第一次出现;

之前的所有数字

5 个答案:

答案 0 :(得分:0)

此答案假定您正在使用Oracle数据库。我不知道单独使用REGEX_INSTR来做到这一点的方法,但是我们可以使用捕获组来使用REGEXP_REPLACE来做到这一点:

SELECT REGEXP_REPLACE('135 ;1111776698 ;AB555678765', '^\s*(\d{3,4})\s*;.*', '\1')
FROM dual;

Demo

这是正在使用的正则表达式模式:

^\s*(\d{3,4})\s*;.*

这允许从字符串的开头开始,任意数量的前导空格,后跟3或4位数字,然后再次任意数量的空格,然后是分号。模式末尾的.*仅消耗字符串中剩余的所有内容。请注意(\d{3,4}),它会捕获 3-4位数字,然后在替换中以\1的形式提供。

答案 1 :(得分:0)

使用INSTR,SUBTSRTRIM应该可以(根据您的评论,有“ 仅空格和数字”)

select TRIM(SUBSTR(s,1, INSTR(s,';')-1)) FROM t;

Demo

答案 2 :(得分:0)

以下使用regexp_substr()的方法应该起作用:

SELECT s, REGEXP_SUBSTR(s, '^[^;]*')

答案 3 :(得分:0)

确保在第一个位置尝试所有可能的值,甚至包括您不希望看到的那些值,并确保按期望的方式处理它们。永远期待意外!此正则表达式匹配零个或多个可选数字的第一个子组(允许返回NULL),后跟一个可选空格,然后是分号或行尾。您可能需要根据情况收紧(或放宽)匹配规则,只需确保甚至测试不正确的值,尤其是在输入来自用户输入的数据的情况下。

with tbl(id, str) as (
  select 1, '135 ;1111776698 ;AB555678765' from dual union all
  select 2, ' 135 ;1111776698 ;AB555678765' from dual union all
  select 3, '135;1111776698 ;AB555678765' from dual union all
  select 4, ';1111776698 ;AB555678765' from dual union all
  select 5, ';135 ;1111776698 ;AB555678765' from dual union all
  select 6, ';;1111776698 ;AB555678765' from dual union all
  select 7, 'xx135 ;1111776698 ;AB555678765' from dual union all
  select 8, '135;1111776698 ;AB555678765' from dual  union all
  select 9, '135xx;1111776698 ;AB555678765' from dual                     
)
select id, regexp_substr(str, '(\d*?)( ?;|$)', 1, 1, NULL, 1) element_1
from tbl
order by id;

       ID ELEMENT_1                     
---------- ------------------------------
         1 135                           
         2 135                           
         3 135                           
         4                               
         5                               
         6                               
         7 135                           
         8 135                           
         9                               

9 rows selected.

答案 4 :(得分:0)

要获得所需的结果,应使用REGEX_SUBSTR,因为它将从您提供的字符串中将所需的数据子字符串化。这是查询的示例。

示例数据的解决方案:
SELECT REGEXP_SUBSTR('135 ;1111776698 ;AB555678765','[^;]+',1,1) FROM DUAL;

因此,Regex会根据;分隔符来拆分字符串。您需要第一次出现,因此我将参数设为1,1
因此,如果您需要第二个字符串1111776698作为输出,则可以将参数设为1,2

Regexp_substr的语法如下:
REGEXP_SUBSTR( string, pattern [, start_position [, nth_appearance [, match_parameter [, sub_expression ] ] ] ] )

以下是更多示例的链接: https://www.techonthenet.com/oracle/functions/regexp_substr.php

让我知道这是否适合您。祝你好运。