2014-12-03 38 views
-2

考虑我的字符串模式如何使用JAVA或ORACLE或VBA来识别PATTERN?

STRING PATTERN 
??? p3 
51213  d5 
F680  ad3 
7D  da 
%%  p2 
.85 pd2 
1.25  dpd2 
SATZ A123  a4_ad3 
SAT1 1A23B a3d_dad2a 

当我给输入字符串我应该给所需的图案效果。 P表示特殊字符。 d表示数字。所有空格应该用下划线_替换,字符应该为a。如果是sss那么我应该得到a3。如果是123那么我应该得到d3。如果是a123那么我应该得到ad3

回答

1

PL/SQL函数

create or replace function get_pattern(p_string in varchar2) return varchar2 is 
    v_translated_string varchar2(4000) := p_string; 
    v_pattern varchar2(4000); 
    v_same_character_counter number := 1; 
begin 
    --Convert characters. 
    v_translated_string := regexp_replace(v_translated_string, '[a-zA-Z]', 'a'); 
    v_translated_string := regexp_replace(v_translated_string, '[0-9]', 'd'); 
    v_translated_string := replace(v_translated_string, ' ', '_'); 
    v_translated_string := regexp_replace(v_translated_string, '[^da\_]', 'p'); 

    --Count and convert to pattern. 
    for i in 1 .. length(v_translated_string) loop 
     if i = length(v_translated_string) then 
      v_pattern := v_pattern || substr(v_translated_string, i, 1)||v_same_character_counter; 
     elsif substr(v_translated_string, i, 1) = substr(v_translated_string, i+1, 1) then 
      v_same_character_counter := v_same_character_counter+1; 
     else 
      v_pattern := v_pattern || substr(v_translated_string, i, 1)||v_same_character_counter; 
      v_same_character_counter := 1; 
     end if; 
    end loop; 

    return replace(v_pattern, '1', null); 
end; 
/

测试查询

select string, expected_pattern, get_pattern(string) actual_pattern 
from 
(
    select '???'  string, 'p3'   expected_pattern from dual union all 
    select '51213'  string, 'd5'   expected_pattern from dual union all 
    select 'F680'  string, 'ad3'  expected_pattern from dual union all 
    select '7D'   string, 'da'   expected_pattern from dual union all 
    select '%%'   string, 'p2'   expected_pattern from dual union all 
    select '.85'  string, 'pd2'  expected_pattern from dual union all 
    select '1.25'  string, 'dpd2'  expected_pattern from dual union all 
    select 'SATZ A123' string, 'a4_ad3'  expected_pattern from dual union all 
    select 'SAT1 1A23B' string, 'a3d_dad2a' expected_pattern from dual 
); 

结果

STRING  EXPECTED_PATTERN ACTUAL_PATTERN 
???   p3     p3 
51213  d5     d5 
F680   ad3    ad3 
7D   da     da 
%%   p2     p2 
.85   pd2    pd2 
1.25   dpd2    dpd2 
SATZ A123 a4_ad3    a4_ad3 
SAT1 1A23B a3d_dad2a   a3d_dad2a