Регулярное выражение в PL / SQL - PullRequest
2 голосов
/ 20 марта 2009

Я использую регулярное выражение, чтобы узнать, является ли введенное пользователем значение буквенно-цифровым, допуская использование некоторых специальных символов.

Я использую следующий код, который отлично работает:

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;

Вышеуказанные программы работают нормально.
Теперь моя проблема в том, что эти специальные символы являются динамическими, и эти значения зависят от приложения.

Другими словами, они хранятся в базе данных и различаются для каждого приложения.

Например, для приложения A это может быть , + - ? @, для B это может быть { ^ & '.

Можно ли написать регулярное выражение так, чтобы оно одновременно проверяло буквенно-цифровые символы и эти динамические специальные символы?

Я пробовал что-то вроде

CREATE OR REPLACE PROCEDURE Validate_Inputstring (input_String IN VARCHAR2) AS
    special_symbols     VARCHAR2(300);

BEGIN
    special_symbols :=',+-?';
    IF  REGEXP_LIKE(input_String,'^[A-Z0-9a-zspecial_symbols]*$') 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 ]

1 голос
/ 19 мая 2009

bobince был на правильном пути, но синтаксис был не совсем верным - оператор конкатенации в Oracle - ||, и в вызовах replace () отсутствовало выражение ...

REGEXP_LIKE(input_String,'^[A-Z0-9a-zspecial_symbols]*$')

Вы должны вырваться из строки, чтобы интерполировать ваши символы:

REGEXP_LIKE(input_String,'^[A-Z0-9a-z' || special_symbols || ']*$')

Однако есть небольшая проблема в том, что ваши специальные символы также могут быть специальными для регулярных выражений. «‘ - »в [] -характер-классе означает« делать диапазон »вместо буквального соответствия« - »; ‘]’ преждевременно завершит класс персонажа. Вам нужно будет экранировать эти символы вместе с обратной косой чертой, используя замену строки.

special_symbols:= ',+-?';
special_group:= replace(replace(replace(special_symbols, '\', '\\'), '-', '\-'), ']', '\]');
IF REGEXP_LIKE(input_String,'^[A-Z0-9a-z' || special_group || ']*$') ...
0 голосов
/ 25 марта 2009

Спасибо за ваш ответ

У меня есть код, как показано ниже FUNCTION Validate_Inputstring_Func (input_String IN VARCHAR2) ВОЗВРАТ BOOLEAN IS

special_symbols VARCHAR2 (300); НАЧАТЬ

special_symbols: = '+? @'; DBMS_OUTPUT.PUT_LINE («Введенное значение равно NULL»); ELSE DBMS_OUTPUT.PUT_LINE («Введенное значение не NULL» || input_String);

IF REGEXP_LIKE (input_String, '^ [A-Z0-9a-z' + special_symbols + '] * $') THEN DBMS_OUTPUT.PUT_LINE ('U ввели буквенно-цифровые символы --->' || input_String); ВОЗВРАТ ложно;

ELSE DBMS_OUTPUT.PUT_LINE ('НЕ введены буквенно-цифровые символы ---->' || input_String); ВОЗВРАТ верный; END IF; END IF;

END;

0 голосов
/ 20 марта 2009

REGEXP_LIKE (input_String, '^ [A-z0-9A-zspecial_symbols] * $')

Вы должны вырваться из строки, чтобы интерполировать ваши символы:

REGEXP_LIKE(input_String,'^[A-Z0-9a-z'+special_symbols+']*$')

Однако есть небольшая проблема в том, что ваши специальные символы также могут быть специальными для регулярных выражений. «‘ - »в [] -характер-классе означает« делать диапазон »вместо буквального соответствия« - »; ‘]’ преждевременно завершит класс персонажа. Вам нужно будет экранировать эти символы вместе с обратной косой чертой, используя строку-замену.

special_symbols:= ',+-?';
special_group:= replace(replace(replace('\', '\\'), '-', '\-'), ']', '\]');
IF REGEXP_LIKE(input_String,'^[A-Z0-9a-z'+special_group+']*$') ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...