Регулярное выражение - PullRequest
       4

Регулярное выражение

0 голосов
/ 25 марта 2011

У меня есть два способа проверить строку на наличие специальных символов в 11g

1) Использование SELECT

V_CNT_QRY := ' SELECT LENGTH(TRIM(TRANSLATE(:1,
                                             ''
                                             abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 '',
                                             '' '')))
                  from dual ';
EXECUTE IMMEDIATE  V_CNT_QRY INTO V_CNT USING V_COLUMN_DATA;

2) Использование процедуры

CREATE OR REPLACE PROCEDURE Validate_Inputstring(input_String IN VARCHAR2) AS
BEGIN
  IF REGEXP_LIKE(input_String, '^[A-Z0-9a-z]*$') THEN
    DBMS_OUTPUT.PUT_LINE('U have entered alphanumeric chars--->' ||
                         input_String);
  ELSE
    DBMS_OUTPUT.PUT_LINE('U NOT have entered alphanumeric chars---->' ||
                         input_String);
  END IF;
END;

Пожалуйста, предложите лучший способ

Ответы [ 3 ]

2 голосов
/ 25 марта 2011

Я бы использовал функцию regexp_replace следующим образом:

select 'You have'|| decode(regexp_replace (:txt,'^[A-Z0-9a-z]*$', '1'), '1', ' ', ' not ')  || 'entered a string composed only by alphanum characters' from dual;

Переменная связывания txt содержит строку для проверки.

2 голосов
/ 25 марта 2011

Предположим, вы хотите проверить, содержит ли строка только символы ASCII, вы можете использовать это:

Select 'No'
  From dual
 Where LENGTH(ASCIISTR(:input_String)) != LENGTH(:input_String)
 Union
Select 'Yes'
  From dual
 Where LENGTH(ASCIISTR(:input_String)) = LENGTH(:input_String)

HTH

1 голос
/ 25 марта 2011
create table testx
( val1 varchar2(50));

insert into testx (val1) values ('Some ' || chr(9) || 'bad string');
insert into testx (val1) values ('Some nice string with 123 numbers');
commit;

select val1, regexp_instr(val1, '[^[:alnum:] ]') from testx;

Функция выбора будет возвращать 0, если строка содержит только буквенно-цифровые или пробелы, в противном случае> 0.

Таким образом, вы можете добавить предложение where, чтобы получить только «плохие» строки:

select val1 from testx where regexp_instr(val1, '[^[:alnum:] ]') > 0;

Конечно, вы можете изменить это по мере необходимости в зависимости от вашего определения «специальных символов».

РЕДАКТИРОВАТЬ: если вас не интересует пометка пунктуации, попробуйте:

select val1 from testx where regexp_instr(val1, '[^[:alnum:] [:punct:]]') > 0;

снова, при необходимости измените ваше определение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...