135 ;1111776698 ;AB555678765
我有上面的字符串,我要寻找的是在第一次出现;
之前检索所有数字。
但是第一次出现;
之前的字符数有所不同,即可以是4位数字或3位数字。
我玩过regex_instr和instr,但我无法弄清楚。
查询应返回第一次出现;
答案 0 :(得分:0)
此答案假定您正在使用Oracle数据库。我不知道单独使用REGEX_INSTR
来做到这一点的方法,但是我们可以使用捕获组来使用REGEXP_REPLACE
来做到这一点:
SELECT REGEXP_REPLACE('135 ;1111776698 ;AB555678765', '^\s*(\d{3,4})\s*;.*', '\1')
FROM dual;
这是正在使用的正则表达式模式:
^\s*(\d{3,4})\s*;.*
这允许从字符串的开头开始,任意数量的前导空格,后跟3或4位数字,然后再次任意数量的空格,然后是分号。模式末尾的.*
仅消耗字符串中剩余的所有内容。请注意(\d{3,4})
,它会捕获 3-4位数字,然后在替换中以\1
的形式提供。
答案 1 :(得分:0)
答案 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
让我知道这是否适合您。祝你好运。