loockup.
で始まり で終わり、_id
接頭辞が付いていないすべての文字列を一致させるにはどうすればよいmsg
ですか? 以下にいくつかの例を示します。
lookup.asset_id -> should match
lookup.msg_id -> shouldn't match
lookup.whateverelse_id -> should match
Oracle が負の後読み (つまり ) をサポートしていないことはわかっています(?<!)
...そのため、代替を使用して可能性を明示的に列挙しようとしました。
regexp_count('i_asset := lookup.asset_id;', 'lookup\.[^\(]+([^m]|m[^s]|ms[^g])_id') <> 0 then
dbms_output.put_line('match'); -- this matches as expected
end if;
regexp_count('i_msg := lookup.msg_id;', 'lookup\.[^\(]+([^m]|m[^s]|ms[^g])_id') <> 0 then
dbms_output.put_line('match'); -- this shouldn’t match
-- but it does like the previous example... why?
end if;
2 番目のregexp_count
式は一致しないはずですが、最初の式は気に入っています。何か不足していますか?
編集
実際の使用例では、複数のlookup.xxx_id
インスタンスを含む可能性のある PL/SQL コードを含む文字列があります。
declare
l_source_code varchar2(2048) := '
...
curry := lookup.curry_id(key_val => ''CHF'', key_type => ''asset_iso'');
asset : = lookup.asset_id(key_val => ''UBSN''); -- this is wrong since it does
-- not specify key_type
...
msg := lookup.msg_id(key_val => ''hello''); -- this is fine since msg_id does
-- not require key_type
';
...
end;
少なくとも 1 つの間違った があるかどうかを判断する必要があります。lookup
つまり、 を除くすべての出現箇所でlookup.msg_id
もパラメータを指定する必要がありkey_type
ます。