1

次の値を含む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 

小数点以下の値を(正規表現を使用して)抽出するにはどうすればよいですか。

例えば:

32767  
0  
0  
32767  
100  
32767  
0  
0  
16383  
16383  
16383  
838  
4

6 に答える 6

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
于 2012-11-14T06:42:03.417 に答える
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 

SQL フィドルのデモ

于 2012-11-14T06:42:05.760 に答える
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 
> 
于 2012-11-14T06:21:31.433 に答える
0

あなたはプログラミング言語について言及していませんでした。通常、この正規表現は小数点以下の数字と一致します。

\.(?<wanted>\d+)

一致した結果から最初のドットを削除できます。または、言語が名前付きグループのキャプチャをサポートしている場合 (たとえば、C# がサポートしている場合) は\1、 、$1、または という名前のグループでそれらの番号をキャプチャできます"wanted"

于 2012-11-14T06:10:41.693 に答える
0

Afaik の肯定的な後読みは Oracle SQL では機能しないため、regexp_replace または regexp_substr を使用する必要があります。ただし、正確な正規表現は、データのソースによって異なる場合があります。あなたが私たちに示したものを正確に含む列があると仮定しました。1つの方法は次のとおりです。

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;
于 2012-11-14T06:43:58.603 に答える
0

として正規表現を使用

   \\.(\\d+\\s*)

見つかった一致ごとに、グループ 1 を使用 (印刷) します。

たとえば、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

于 2012-11-14T06:13:31.720 に答える