Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
DimaU Member Откуда: Москва Сообщений: 548 |
Народ, есть у кого под рукой для MS SQL кусок кода (функция), чтобы сделать выделение подстроки с e-mail c помощью patindex (и тп) из большой строки. Е-mail (в строке один) может быть ограничен пробелами или точкой, запятой. Например: Из строк: 1) jgsjsshjsh l;sh;jhj;sh;jshjj;hss; s;s Mail1@privet.ru SFFSFSS SFS 2) jgjjgj gdldg;dg; dg''dg'g'd'g' Mail2777@privet.com, tel 12234 надо получить Mail1@privet.ru Mail2777@privet.com |
27 апр 18, 20:53 [21375350] Ответить | Цитировать Сообщить модератору |
Руслан Дамирович Member Откуда: Резиновая нерезиновая Сообщений: 940 |
DECLARE @t TABLE ( [text] VARCHAR(500) ) INSERT INTO @t VALUES ( 'jgsjsshjsh l;sh;jhj;sh;jshjj;hss; s;s Mail1@privet.ru SFFSFSS SFS' ), ( 'jgjjgj gdldg;dg; dg''''dg''g''d''g'' Mail2777@privet.com, tel 12234' ) ; SELECT [text], [email] = SUBSTRING( [text], [i] - [ib] + 1, [ib] + [ie] - 1 ) FROM @t t CROSS APPLY ( SELECT [len] = LEN( [text] ), [i] = PATINDEX( '%@%', [text] ) ) ss1 CROSS APPLY ( SELECT [ib] = PATINDEX( '%[ ,;]%', REVERSE( SUBSTRING( [text], 1, [i] - 1 ) ) ), [ie] = PATINDEX( '%[ ,;]%', SUBSTRING( [text], [i] + 1, [len] - [i] ) ) ) ss2 А вообще, смотри в строну REGEX, которые в T-SQL можно заполучить с помощью .NET CLR |
28 апр 18, 11:56 [21376635] Ответить | Цитировать Сообщить модератору |
aleks222 Member Откуда: Сообщений: 1244 |
Не надо RegExp. Вы бредите. RegExp - это ужос. Причем вредный ужос. DECLARE @t TABLE ( [text] VARCHAR(500) ) INSERT INTO @t VALUES ( 'jgsjsshjsh l;sh;jhj;sh;jshjj;hss; s;s Mail1@privet.ru SFFSFSS SFS' ), ( 'jgjjgj gdldg;dg; dg''''dg''g''d''g'' Mail2777@privet.com, tel 12234' ) ; with t as (SELECT [text], txt = replace([text], ';', ' ' from @t ) , x as ( select t.[text], x.s from t cross apply split(t.txt) as x(s) ) select * from x where charindex(s, '@') > 0 |
||
28 апр 18, 15:38 [21377471] Ответить | Цитировать Сообщить модератору |
Руслан Дамирович Member Откуда: Резиновая нерезиновая Сообщений: 940 |
aleks222, Код split(t.txt) опубликуйте, иначе ваше предположение "Не надо RegExp. Вы бредите." я буду считать переходом на личности. Я очень хорошо разбираюсь в RegEx, и в том, что его не нужно применять повсеместно. Но в целом, в контексте задачи извлечения данных из мусорного набора текста - лучше, чем "вредный ужос" придумать очень сложно. |
28 апр 18, 15:46 [21377493] Ответить | Цитировать Сообщить модератору |
aleks222 Member Откуда: Сообщений: 1244 |
STRING_SPLIT (Transact-SQL) 10.06.2016 Разделяет символьное выражение с использованием указанного разделителя. |
29 апр 18, 03:14 [21378348] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8350 |
Руслан Дамирович, как здесь помогут регулярные выражения? Заменить на пустую строку все, что не выражение? |
1 май 18, 17:07 [21381583] Ответить | Цитировать Сообщить модератору |
Alexander Us Member Откуда: Сообщений: 1153 |
Если регулярные выражения залиты на сервер то как то так: declare @str1 varchar(max) = 'jgsjsshjsh l;sh;jhj;sh;jshjj;hss; s;s Mail1@privet.ru SFFSFSS SFS' declare @str2 varchar(max) = 'jgjjgj gdldg;dg; dg''''dg''g''d''g'' Mail2777@privet.com, tel 12234' declare @mail varchar(100) = '([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)' select Tools.dbo.fn_Replace(@str1,'^(.*)(?<M>'+@mail+')(.*)$','${M}') where Tools.dbo.fn_isMatch(@str1,@mail)=1 -->1@privet.ru select Tools.dbo.fn_Replace(@str2,'^(.*)(?<M>'+@mail+')(.*)$','${M}') where Tools.dbo.fn_isMatch(@str2,@mail)=1 -->7@privet.com |
||
2 май 18, 13:05 [21382566] Ответить | Цитировать Сообщить модератору |
Wlr-l Member Откуда: Сообщений: 523 |
Пример Руслана Дамировича для случаев, когда Е-mail может быть в начале или в конце строки:insert @t values ('jgsjsshjsh l;sh;jhj;sh;jshjj;hss; s;s Mail1@privet.ru SFFSFSS SFS'), ('jgsjsshjsh l;sh;jhj;sh;jshjj;hss; s;s Mail1@privet.ru; SFFSFSS SFS'), ('jgsjsshjsh l;sh;jhj;sh;jshjj;hss; s;s ,Mail1@privet.ru; SFFSFSS SFS'), ('jgsjsshjsh l;sh;jhj;sh;jshjj;hss; s;s ;Mail1@privet.ru; SFFSFSS SFS'), ('Mail1@privet.ru; SFFSFSS SFS'), ('jgjjgj gdldg;dg; dg''''dg''g''d''g'' Mail2777@privet.com'); select text, substring(text, i-ib, ib+ie) as email from @t t cross apply (select patindex('%@%', text) as i ) ss1 cross apply (select patindex('%[ ,;]%', reverse(substring(' '+text, 1, i-1))) as ib, patindex('%[ ,;]%', substring(text+' ', i+1, 8000)) as ie ) ss2 |
2 май 18, 15:53 [21382789] Ответить | Цитировать Сообщить модератору |
Руслан Дамирович Member Откуда: Резиновая нерезиновая Сообщений: 940 |
...нужно просто поставить в начале и в конце искомой строки символ разделителя, например ';' + [text] + ';' ) и конечно, добавить условие, что знак @ вообще есть в тексте - иначе не взлетит. |
||
3 май 18, 11:57 [21383930] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |