我从包含以下值的oracle表(使用sql)中进行选择:
ae0.32767
bcm0.0
em0.0
ge-0/1/0.32767
ge-7/1/0.100
ge-7/1/0.32767
lo0.0
lsi.0
pc-0/0/0.16383
pc-1/0/0.16383
pc-5/0/0.16383
xe-0/0/0.838
如何在小数点之后提取值(使用regexp),但不包括小数点。
例如:
32767
0
0
32767
100
32767
0
0
16383
16383
16383
838
答案 0 :(得分:3)
regexp_substr函数可用于在字符串结尾处的句点之后提取数字。这是一个例子:
-- sample of data from your question
SQL> with t1 as (
2 select 'ae0.32767' as col from dual union all
3 select 'bcm0.0' from dual union all
4 select 'em0.0' from dual union all
5 select 'ge-0/1/0.32767' from dual union all
6 select 'ge-7/1/0.100' from dual union all
7 select 'ge-7/1/0.32767' from dual union all
8 select 'lo0.0' from dual union all
9 select 'lsi.0' from dual union all
10 select 'pc-0/0/0.16383' from dual union all
11 select 'pc-1/0/0.16383' from dual union all
12 select 'pc-5/0/0.16383' from dual union all
13 select 'xe-0/0/0.838' from dual
14 )
15 select regexp_substr(col, '(\.)([[:digit:]]+)$', 1,1,'i',2) res
16 from t1
17 ;
RES
--------------------------------------------------------
32767
0
0
32767
100
32767
0
0
16383
16383
16383
838
12 rows selected
答案 1 :(得分:1)
尝试使用substr和instr来获得所需的输出,如下所示
SELECT SUBSTR ('ge-0/1/0.32767',
INSTR ('ge-0/1/0.32767', '.') + 1,
LENGTH ('ge-0/1/0.32767') - INSTR ('ge-0/1/0.32767', '.')
)
FROM DUAL
答案 2 :(得分:0)
你没有提到编程语言。通常,此正则表达式匹配小数点后的数字:
\.(?<wanted>\d+)
您可以从匹配的结果中删除初始点,或者如果您的语言支持命名组捕获(例如,C#),您可以使用\1
,$1
或名为{的组捕获这些数字{1}}。
答案 3 :(得分:0)
使用正则表达式
\\.(\\d+\\s*)
对于找到的每个匹配项,请使用(打印)组1。
e.g。在 JAVA :
Pattern pattern = Pattern.compile("\\.(\\d+\\s*)");
Matcher matcher = pattern.matcher("ae0.32767 bcm0.0 em0.0 ge-0/1/0.32767 "+
"ge-7/1/0.100 ge-7/1/0.32767 lo0.0 lsi.0 "+
"pc-0/0/0.16383 pc-1/0/0.16383 "+
"pc-5/0/0.16383 xe-0/0/0.838");
while(matcher.find()) {
System.out.println(matcher.group(1));
}
打印:
32767 0 0 32767 100 32767 0 0 16383 16383 16383 838
答案 4 :(得分:0)
您可以使用:'s/.*\.\(.*\)/\1/'
> cat temp
ae0.32767
bcm0.0
em0.0
ge-0/1/0.32767
ge-7/1/0.100
ge-7/1/0.32767
lo0.0
lsi.0
pc-0/0/0.16383
pc-1/0/0.16383
pc-5/0/0.16383
xe-0/0/0.838
> sed 's/.*\.\(.*\)/\1/' temp
32767
0
0
32767
100
32767
0
0
16383
16383
16383
838
>
答案 5 :(得分:0)
Afaik正面lookbehind在Oracle SQL中不起作用,因此您必须使用一些regexp_replace或regexp_substr。确切的正则表达式可能取决于您的数据来源。我假设你的专栏中包含你向我们展示的内容;一种方法可能是:
create table tmp_test (s varchar2(100));
insert into tmp_test values ('bcm0.0');
insert into tmp_test values ('ge-0/1/0.32767');
select substr(regexp_substr(s, '\.\d+$'), 2) from tmp_test; -- or
select regexp_replace(s, '^.*\.(\d+)$', '\1') from tmp_test;
如果您的文本不是唯一的,则必须更改正则表达式,特别是删除“锚点”^和$。像
这样的东西insert into tmp_test values ('this is the ge-0/1/0.32767 fact');
select substr(regexp_substr(s, '\.\d+'), 2) from tmp_test;
select regexp_replace(s, '.*\.(\d+).*', '\1') from tmp_test;