Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 не работает регулярное выражение  [new]
relav
Member

Откуда:
Сообщений: 204
здравствуйте!
выполняя скрипт сравниваю переменную,типа varchar, на соответствие регулярному выражению '[0-9]|[0-9][0-9]'. Ввожу программу строку 12 или 1 и программа ругается. Такое впечатление, что сервер не воспринимает знак ИЛИ (|). Почему? Привожу скрипт.
+
if (@ADRESS like '([0-9]|[0-9][0-9])')
     Raiserror('Введено верно',16,1);
   else
     raiserror('Введен недопустимый адрес',16,1);
23 июл 15, 15:39    [17926116]     Ответить | Цитировать Сообщить модератору
 Re: не работает регулярное выражение  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
relav,

LIKE - это не регулярное выражение.
Если бы Вы прочитали про этот предикат, то узнали бы обо всех спецсимволах.
В данном случае всё сведётся к двум LIKEам с оператором OR
23 июл 15, 15:43    [17926145]     Ответить | Цитировать Сообщить модератору
 Re: не работает регулярное выражение  [new]
Glory
Member

Откуда:
Сообщений: 104751
relav
Такое впечатление, что сервер не воспринимает знак ИЛИ (|). Почему?

серверу трудно воспринимать выдуманный синтаксис
23 июл 15, 15:44    [17926150]     Ответить | Цитировать Сообщить модератору
 Re: не работает регулярное выражение  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
relav,

like не имеет отношения к регулярным выражениям. Справка - Ваш лучший друг.
23 июл 15, 15:45    [17926154]     Ответить | Цитировать Сообщить модератору
 Re: не работает регулярное выражение  [new]
relav
Member

Откуда:
Сообщений: 204
iap,

а какая функция в mssql воспринимает регулярные выражения или как написать регулярное выражение [0-9]|[0-9][0-9] чтоб сервер воспринял?
23 июл 15, 15:48    [17926176]     Ответить | Цитировать Сообщить модератору
 Re: не работает регулярное выражение  [new]
Glory
Member

Откуда:
Сообщений: 104751
relav
а какая функция в mssql воспринимает регулярные выражения

Встроенная - никакая

relav
или как написать регулярное выражение [0-9]|[0-9][0-9] чтоб сервер воспринял?

Изучить LIKE
23 июл 15, 15:52    [17926200]     Ответить | Цитировать Сообщить модератору
 Re: не работает регулярное выражение  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
relav
как написать регулярное выражение [0-9]|[0-9][0-9] чтоб сервер воспринял?
Я же написал, кажется?
relav
а какая функция в mssql воспринимает регулярные выражения
микрософтовской по-прежнему не существует.
Однако тут есть фанаты самописных CLR-функций - сейчас набегут, наверно!
Поищите тут - спецтопик один из них заводил недавно.
23 июл 15, 15:52    [17926202]     Ответить | Цитировать Сообщить модератору
 Re: не работает регулярное выражение  [new]
relav
Member

Откуда:
Сообщений: 204
iap,

вообще у меня задача проверить параметр ip_address4 на правильность ввода. В этот параметр передают ip адрес и мне его нужно проверить на правильность чтоб там не было символов. Как мне это сделать , если не существуют регулярных выражений в mssql?
23 июл 15, 15:59    [17926244]     Ответить | Цитировать Сообщить модератору
 Re: не работает регулярное выражение  [new]
Glory
Member

Откуда:
Сообщений: 104751
relav
Как мне это сделать , если не существуют регулярных выражений в mssql?

Вы ответы читаете ?
23 июл 15, 16:03    [17926260]     Ответить | Цитировать Сообщить модератору
 Re: не работает регулярное выражение  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
relav
iap,

вообще у меня задача проверить параметр ip_address4 на правильность ввода. В этот параметр передают ip адрес и мне его нужно проверить на правильность чтоб там не было символов. Как мне это сделать , если не существуют регулярных выражений в mssql?
@ADRESS LIKE '([0-9][0-9])' OR @ADRESS LIKE '[0-9]'
не годится?
relav
чтоб там не было символов
Подробнее об этом.
А то получается, что в строке должно быть или 1 или 2 цифры в круглых скобках. Вам надо это?
23 июл 15, 16:03    [17926262]     Ответить | Цитировать Сообщить модератору
 Re: не работает регулярное выражение  [new]
Konst_One
Member

Откуда:
Сообщений: 11625
ну поищите готовые ф-ии. вот одна из них:

CREATE FUNCTION fn_ValidateIP
(
    @ip varchar(15)
)
RETURNS int
AS
BEGIN
    DECLARE @Result int = 0
        IF
            @ip not like '%,%' and
            isnumeric(PARSENAME(@ip,4)) = 1 and
            isnumeric(PARSENAME(@ip,3)) = 1 and
            isnumeric(PARSENAME(@ip,2)) = 1 and
            isnumeric(PARSENAME(@ip,1)) = 1 and
            cast(PARSENAME(@ip,4) as int) between 1 and 255 and
            cast(PARSENAME(@ip,3) as int) between 0 and 255 and
            cast(PARSENAME(@ip,2) as int) between 0 and 255 and
            cast(PARSENAME(@ip,1) as int) between 0 and 255
            set @Result = 1
        ELSE
            set @Result = 0
    RETURN @Result
END

select dbo.fn_ValidateIP('127.0.0.1')
select dbo.fn_ValidateIP('127,.0.0.1')
23 июл 15, 16:03    [17926264]     Ответить | Цитировать Сообщить модератору
 Re: не работает регулярное выражение  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Я там во втором LIKE круглые скобки забыл
23 июл 15, 16:03    [17926268]     Ответить | Цитировать Сообщить модератору
 Re: не работает регулярное выражение  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Konst_One
ну поищите готовые ф-ии. вот одна из них:

CREATE FUNCTION fn_ValidateIP
(
    @ip varchar(15)
)
RETURNS int
AS
BEGIN
    DECLARE @Result int = 0
        IF
            @ip not like '%,%' and
            isnumeric(PARSENAME(@ip,4)) = 1 and
            isnumeric(PARSENAME(@ip,3)) = 1 and
            isnumeric(PARSENAME(@ip,2)) = 1 and
            isnumeric(PARSENAME(@ip,1)) = 1 and
            cast(PARSENAME(@ip,4) as int) between 1 and 255 and
            cast(PARSENAME(@ip,3) as int) between 0 and 255 and
            cast(PARSENAME(@ip,2) as int) between 0 and 255 and
            cast(PARSENAME(@ip,1) as int) between 0 and 255
            set @Result = 1
        ELSE
            set @Result = 0
    RETURN @Result
END

select dbo.fn_ValidateIP('127.0.0.1')
select dbo.fn_ValidateIP('127,.0.0.1')
Это безобразие какое-то, а не функция!
За что топикстартера-то так?
23 июл 15, 16:05    [17926281]     Ответить | Цитировать Сообщить модератору
 Re: не работает регулярное выражение  [new]
Konst_One
Member

Откуда:
Сообщений: 11625
чтоб в следующий раз сначала пользовался поиском.



а тут ему сразу и IP и LIKE и тд и тп
23 июл 15, 16:06    [17926291]     Ответить | Цитировать Сообщить модератору
 Re: не работает регулярное выражение  [new]
o-o as churupaha
Guest
iap
relav
как написать регулярное выражение [0-9]|[0-9][0-9] чтоб сервер воспринял?
Я же написал, кажется?
relav
а какая функция в mssql воспринимает регулярные выражения
микрософтовской по-прежнему не существует.
Однако тут есть фанаты самописных CLR-функций - сейчас набегут, наверно!
Поищите тут - спецтопик один из них заводил недавно.

FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...
23 июл 15, 16:07    [17926296]     Ответить | Цитировать Сообщить модератору
 Re: не работает регулярное выражение  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Konst_One
чтоб в следующий раз сначала пользовался поиском.



а тут ему сразу и IP и LIKE и тд и тп
Но и неправда про ISNUMERIC()!
23 июл 15, 16:08    [17926310]     Ответить | Цитировать Сообщить модератору
 Re: не работает регулярное выражение  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
@ADRESS LIKE '[0-9][0-9]' OR @ADRESS LIKE '[0-9]'


без скобок

или SQL2012+

TRY_PARSE(@ADRESS AS TINYINT) BETWEEN 0 AND 99
23 июл 15, 16:08    [17926311]     Ответить | Цитировать Сообщить модератору
 Re: не работает регулярное выражение  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
relav
iap,

вообще у меня задача проверить параметр ip_address4 на правильность ввода. В этот параметр передают ip адрес и мне его нужно проверить на правильность чтоб там не было символов. Как мне это сделать , если не существуют регулярных выражений в mssql?

Ваш первый пример можно переписать так:
if (@ADRESS like '[0-9]' or @ADRESS like '[0-9][0-9]' or @ADRESS like '[0-9][0-9][0-9]')
     Raiserror('Введено верно',16,1);
   else
     raiserror('Введен недопустимый адрес',16,1);

А проверку ip address4 лучше сделать, выделив подстроки между точками, и проверив их на то, что это целые числа в диапазоне 1-255 (ну, или как вам надо). Выделять удобно командой PARSENAME
23 июл 15, 16:09    [17926312]     Ответить | Цитировать Сообщить модератору
 Re: не работает регулярное выражение  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Кстати, можно же и так:
@ADRESS NOT LIKE '%[^0-9]%' AND LEN(@ADRESS) BETWEEN 1 AND 3
23 июл 15, 16:19    [17926399]     Ответить | Цитировать Сообщить модератору
 Re: не работает регулярное выражение  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
iap
Кстати, можно же и так:
@ADRESS NOT LIKE '%[^0-9]%' AND LEN(@ADRESS) BETWEEN 1 AND 3
Если имелся в виду ip, то, конечно, надо усложнять.
23 июл 15, 16:20    [17926406]     Ответить | Цитировать Сообщить модератору
 Re: не работает регулярное выражение  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
если требуется именно валидация строки, а не выдрать все, что похоже на ip, то можно такой портянкой

\A([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}\Z


+ нотариально заверенный скриншот
Картинка с другого сайта.


ссыль вам кинул o-o выше.

(и еще я не знаю бывают ли ip начинающиеся с 0., я решил что не бывают, rfc читать лень, потому регулярка считает, что не бывает).
23 июл 15, 18:03    [17926995]     Ответить | Цитировать Сообщить модератору
 Re: не работает регулярное выражение  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
relav
iap,

проверить параметр ip_address4
чтоб там не было символов.



тогда так

-- так
^\d{0,3}(\.\d{0,3}){3}$

-- или вообще так
^[\d\.]+$


зачем вам тогда регулярка?
23 июл 15, 18:13    [17927042]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить