PL / SQL регулярное выражение проверки, как выйти из ' - PullRequest
2 голосов
/ 18 февраля 2020

Я работаю над функцией проверки fullName, примеры, которые могут go:

John Deep

JohnDeep

John-Deep

Я хочу использовать это регулярное выражение:

^\p{L}+[\p{L}\p{Pd}\p{Zs}']*\p{L}+$|^\p{L}+$

Моя функция проверки:

 create or replace FUNCTION is_valid_fullName (str IN VARCHAR2) RETURN VARCHAR2 AS
        bln BOOLEAN;
    begin       
     if regexp_like(str, '^\p{L}+[\p{L}\p{Pd}\p{Zs}']*\p{L}+$|^\p{L}+$') then

            return 1;
      else 
        return 0;
     end if;
     end;

Однако у меня проблема с синтаксисом.

PLS-00103: Обнаружен символ "]", когда ...

Как я могу решить эту проблему?

Ответы [ 3 ]

1 голос
/ 18 февраля 2020

Чтобы ввести одинарную кавычку в строку, удвойте ее.

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

^\p{L}+([\p{L}\p{Pd}\p{Zs}']*\p{L}+)?$
       ^                           ^^  

Однако , вы не можете использовать классы свойств Unicode в регулярном выражении Oracle. Что вы можете сделать, это использовать POSIX [:alpha:] класс символов вместо \p{L}, чтобы соответствовать любой букве Юникода и прописать \p{Pd} ([\u002D\u058A\u05BE\u1400\u1806\u2010\u2011\u2012\u2013\u2014\u2015\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D]) и \p{Zs} ([\u0020\u3000\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2008\u2009\u200A\u205F\u00A0\u2007\u202F]) Классы свойств Unicode. Вы также можете рассмотреть возможность использования классов символов POSIX [:space:] / [:blank:] вместо \p{Zs}, поскольку \p{Zs} соответствует всем горизонтальным пробелам НО символ табуляции.

Преобразованный шаблон будет выглядит как

'^[[:alpha:]]+([-[:alpha:]' || unistr('\058A') || unistr('\05BE') || unistr('\1400') || unistr('\1806') || unistr('\2010') || unistr('\2011') || unistr('\2012') || unistr('\2013') || unistr('\2014') || unistr('\2015') || unistr('\2E17') || unistr('\2E1A') || unistr('\2E3A') || unistr('\2E3B') || unistr('\2E40') || unistr('\301C') || unistr('\3030') || unistr('\30A0') || unistr('\FE31') || unistr('\FE32') || unistr('\FE58') || unistr('\FE63') || unistr('\FF0D') || unistr('\0009') || unistr('\3000') || unistr('\1680') || unistr('\2000') || unistr('\2001') || unistr('\2002') || unistr('\2003') || unistr('\2004') || unistr('\2005') || unistr('\2006') || unistr('\2008') || unistr('\2009') || unistr('\200A') || unistr('\205F') || unistr('\00A0') || unistr('\2007') || unistr('\202F') || ' '']*[[:alpha:]]+)?$'

Или, если вы используете [:blank:]:

'^[[:alpha:]]+([-[:alpha:][:blank:]' || unistr('\058A') || unistr('\05BE') || unistr('\1400') || unistr('\1806') || unistr('\2010') || unistr('\2011') || unistr('\2012') || unistr('\2013') || unistr('\2014') || unistr('\2015') || unistr('\2E17') || unistr('\2E1A') || unistr('\2E3A') || unistr('\2E3B') || unistr('\2E40') || unistr('\301C') || unistr('\3030') || unistr('\30A0') || unistr('\FE31') || unistr('\FE32') || unistr('\FE58') || unistr('\FE63') || unistr('\FF0D') || ' '']*[[:alpha:]]+)?$'

См. демонстрационный пример regex (1 означает, что было совпадение).

0 голосов
/ 18 февраля 2020

Если приведенные вами примеры являются единственными, которые должны соответствовать, используйте:
regexp_like(str, '^\p{L}+[\p{L}\p{Pd}\p{Zs}]*\p{L}+$|^\p{L}+$')

Но если вы хотите, чтобы регулярное выражение соответствовало "Jhon o 'Deep", вам нужно как-то сбежать этот ' символ.

0 голосов
/ 18 февраля 2020
regexp_like(str, '^\p{L}+[\p{L}\p{Pd}\p{Zs}']*\p{L}+$|^\p{L}+$')

Я думаю, что это вторая одинарная кавычка между p {Zs} и] * \ p

Редактировать: Когда я выполняю регулярные выражения, мне тоже нравится онлайн: regexTester или regex101 Также есть пример для некоторых полезных регулярных выражений.

...