1

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ます。

4

2 に答える 2