#sql #regex #oracle-sqldeveloper
#sql #регулярное выражение #oracle-sqldeveloper
Вопрос:
В файл сценария я вставил следующий код.
drop table Test;
create table Test(
name char(2) unique not null,
constraint name_c check(
regexp_like(name, '^[A-Z]{1,2}$', 'c')
)
);
insert into Test values ('B');
Разработчик никогда не сдвинется с места. Он продолжает говорить, что нарушает ограничение name_c, и я не понимаю, почему. Для меня регулярное выражение выглядит нормально.
Однако некоторые варианты завершились успешно, например, удаление знака доллара
drop table Test;
create table Test(
name char(2) unique not null,
constraint name_c check(
regexp_like(name, '^[A-Z]{1,2}', 'c')
)
);
insert into Test values ('B');
И я тоже не понимаю.
Почему?
Редактировать: это проблема: логически регулярное выражение правильное. Но почему-то Oracle SQL Developer не сдвинулся с места.
Комментарии:
1. Что здесь подразумевается? Вам нужны 1 или 2 заглавные буквы или просто что-то, что начинается с 1 или 2 заглавных букв?
2. В чем различия? Я предполагаю, что начните с 1 заглавной буквы = хотите 1 заглавную букву, начните с 2 заглавных букв = хотите 2 заглавные буквы
3. К сожалению, это не отвечает на мой вопрос.
4. Начните с 1 заглавной буквы или начните с 2 заглавных букв. Если оно начинается с 1 заглавной буквы, то за ним ничего не должно быть.
5. Тогда вам нужна вторая версия.
Ответ №1:
если вы решили начать с 1 или 2 заглавных букв и не имеет значения, что будет дальше, вы должны сделать это следующим образом :
^[A-Z]{1,2}.*
.* mean 1 or more character exept n (nex line)
Комментарии:
1. Но мне не все равно, что будет дальше. Я хочу начинать и заканчивать точными буквами. Вот почему я помещаю знак доллара в регулярное выражение. И это не работает в oracle sql developer.
2. если вам нужна только первая буква в верхнем регистре, а остальные в нижнем регистре, тогда напишите это так,
^[A-Z]{1,1}[a-z] .
иначе, если вы хотите, чтобы первая буква была прописной, а остальные — верхними или нижними, тогда^[A-Z]{1,1}[a-zA-Z]
, если вы хотите, чтобы 1 или буксировка были верхними в первом, тогда измените[A-Z]{1,1}
[A-Z]{1,2}
, я желаю, чтобы это помогло вам3. Извините, я был несправедлив. Да, решение работает. Но мне интересно, что случилось со знаком доллара? Я имею в виду, что в этом примере $ кажется ошибочным.
4. знак $ означает совпадение конца текстовой строки или конца строки в многострочном регистре, и он используется в случае, если вы прошли тест на последнюю букву или хотите, чтобы весь текст совпадал. Пример Par
^text$
, который проверит, соответствует ли строка с отверстием ‘test’, и в случаеtext$
, если это проверит, заканчивается ли строка на ‘test’, и в случае^text
, если он проверит, начинается ли строка с ‘test’ в вашем примере, если имя может быть чем-то другим в конце, тогда вам следует добавить знак $5.
^[A-Z]{1,2}$
в этом выражении то, что я говорю, начинается и заканчивается 2 заглавными буквами. Мой вопрос: почему это не работает? И почему это работает после удаления знака доллара. Это беспокоит меня больше всего.