如何使用JAVA、ORACLE或VBA识别模式?

如何使用JAVA、ORACLE或VBA识别模式?,java,oracle,vba,Java,Oracle,Vba,考虑我的字符串模式 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。如

考虑我的字符串模式

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

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