如何使用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