0 / 0 / 0
Регистрация: 29.04.2016
Сообщений: 8
1

Как выдернуть из строки подстроку по регулярному выражению?

29.04.2016, 12:43. Показов 2904. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня есть колонка такого вида:
(3466) 6124132
gray3412@gray-nv.ru
То есть в ней почти всегда есть email и может быть несколько телефонов.
Задача разделить email и телефон на 2 разные колонки
С помощью функции replace у меня получалось "вырезать" отсюда email и оставались телефоны.
Вот такая функция:
Visual Basic
1
2
3
4
5
6
7
8
Public Function RgxReplace(aregexp As String, _
astring As Range, _
areplace As String) As String
Dim re As RegExp
Set re = New RegExp
re.Pattern = aregexp
RgxReplace = re.Replace(astring, areplace)
End Function
А вторую половину задачи - оставить только email не знаю как. С помощью этой функции не получится так как там может быть текст и создать регулярное выражение, чтобы вырезать все кроме мыла помоему не получится. Поэтому нужна скорее всего другая функция.
Вот пример колонки:
"(3466) 4910340 доб. 1231
snph-kadry@rambler.ru"
---------------------------------
"(3466) 49103420 доб. 1231
snph-kadry123@rambler.ru"
--------------------------------
"(3466) 491030 доб. 1231
snph-kadry123@rambler.ru"
------------------------------
"(3466) 491030 доб. 1231
snph-kadry123@rambler.ru"
--------------------------
"(3466) 296106, (3466) 296831, (3466) 295805
otrrrdniynv@mail.ru"
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.04.2016, 12:43
Ответы с готовыми решениями:

Замена текста по регулярному выражению
В файле имеется ряд строк, среди которых есть следующая строка: starts3d4s4end Необходимо найти...

Поиск замена по регулярному выражению в word
Добрый день. Пишу макрос для автоматической замены и расстановки меток. Требуется следующее: 1)...

Замена текста по регулярному выражению (Макрос для Word)
В регулярках новичок. В документе имеются следующие строки: ] ] ] Их необходимо найти и...

Выбрать подстроку из строки по регулярному выражению
Всем доброго ) Подскажите регулярное выражения что выбрать текст, вот здесь; $_SESSION =...

9
Заблокирован
29.04.2016, 12:57 2
Цитата Сообщение от justmen Посмотреть сообщение
(3466) 6124132
gray3412@gray-nv.ru
- это одна ячейка (или что там у вас)?
Какими символами разделены первая (телефон) и вторая (мыло) строки?
Может простого SPLIT`а здесь достаточно будет?
0
0 / 0 / 0
Регистрация: 29.04.2016
Сообщений: 8
29.04.2016, 15:25  [ТС] 3
1. - это одна ячейка (или что там у вас)?
2. Какими символами разделены первая (телефон) и вторая (мыло) строки?
Может простого SPLIT`а здесь достаточно будет?

1. В одной ячейке находятся телефоны и email одной организации. И таких целая колонка
2. Без пробела после телефона сразу мыло
0
Заблокирован
29.04.2016, 17:32 4
Цитата Сообщение от justmen Посмотреть сообщение
после телефона сразу мыло
Здесь вы ошибаетесь.
Какой то перенос строки там есть.

Пробуйте -
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub asd()
Dim a$(), s$
's = vbCrLf
's = vbCr
s = vbLf
's = vbLf & vbLf
With ActiveCell
  a = Split(.Value, s)
  .Offset(, 1) = a(0)
  .Offset(, 2) = a(1)
End With
End Sub
Если получилось с активной ячейкой - организуйте по тому же принципу цикл по столбцу.
0
0 / 0 / 0
Регистрация: 29.04.2016
Сообщений: 8
29.04.2016, 21:19  [ТС] 5
Работает!!! Спасибо большое, очень помогли. А как сделать цикл по столбцу?
0
Заблокирован
29.04.2016, 21:47 6
justmen, у меня нет вашей таблицы, гадать что там, где и как не буду,
просто выделите данные и запустите -
Visual Basic
1
2
3
4
5
6
7
8
9
10
Sub asd
dim rn as range,a$()
for each rn in selection
  With rn
    a = Split(.Value, vblf)
    .Offset(, 1) = a(0)
    .Offset(, 2) = a(1)
  End With
next
end sub
0
132 / 108 / 22
Регистрация: 23.06.2015
Сообщений: 339
29.04.2016, 22:04 7
добрый вечер,вариант функций в файл -примере: в столбце C функция uuu, в столбце E функция vvv,в столбце G функция yyy,
можно добавить этот файл-пример более точными Вашими данными,не нашел в теме Вашего файл -примера.

Visual Basic
1
2
3
4
5
Function yyy$(t$)
 With CreateObject("VBScript.RegExp"): .Pattern = "(.+)\s+" & uuu(t)
    yyy = .Execute(t)(0).Submatches(0)
 End With
End Function
Visual Basic
1
2
3
4
5
Function vvv$(t$)
 With CreateObject("VBScript.RegExp"): .Pattern = "\(\d+\)\s+\d+"
    vvv = .Execute(t)(0)
 End With
End Function
Visual Basic
1
2
3
4
5
Function uuu$(t$)
 With CreateObject("VBScript.RegExp"): .Pattern = "[-\w]+@[\w\.]+"
    uuu = .Execute(t)(0)
 End With
End Function
Вложения
Тип файла: xls example_30_04_2016_cbr_1.xls (38.0 Кб, 7 просмотров)
0
45 / 45 / 15
Регистрация: 14.04.2016
Сообщений: 128
30.04.2016, 11:15 8
На случай, если на строке с адресом будет еще что-то, лучше перестраховаться
Visual Basic
1
2
3
4
5
6
7
8
9
Function tttt(Text As String)
    Dim M As Object
    With CreateObject("VBScript.Regexp")
        .MultiLine = True
        .Pattern = "(?:\b)([\w\-\.]+@[\w\-\.]+)(?:\b)"
        Set M = .Execute(Text)
        If M.Count > 0 Then tttt = M(0).submatches(0)
    End With
End Function
0
132 / 108 / 22
Регистрация: 23.06.2015
Сообщений: 339
30.04.2016, 18:15 9
добрый вечер,justmen,добавил еще строку 6 в файл пример,в столбцах C E G соответственно функциии uuu vvv yyy
и функция от MBT tttt в столбце J работают во всех строках,
аналоги макроса#6,соответственно функции zzz1 и zzz2 в столбцах M и P,очевидно,работают только в строке 6,-для такого типа данных.
Вложения
Тип файла: xls example_30_04_2016_cbr_2.xls (44.5 Кб, 9 просмотров)
0
45 / 45 / 15
Регистрация: 14.04.2016
Сообщений: 128
30.04.2016, 18:55 10
Вариант макроса с использованием массивов (на значительных объемах данных даст реальный прирост скорости работы)
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub tt()
    Dim arr(), Rng As Range, I As Long, M As Object
    Set Rng = Range("A1:A" & Cells(Rows.Count, "A").End(xlUp).Row)
    arr = Rng
    ReDim Preserve arr(1 To UBound(arr), 1 To 2)
    With CreateObject("VBScript.Regexp")
        .MultiLine = True
        .Pattern = "(?:\b)([\w\-\.]+@[\w\-\.]+)(?:\b)"
        For I = 1 To UBound(arr)
            Set M = .Execute(arr(I, 1))
            If M.Count > 0 Then
                arr(I, 2) = M(0).submatches(0)
                arr(I, 1) = Trim(Replace(arr(I, 1), arr(I, 2), " "))
            End If
        Next
    End With
    Rng.Resize(Rng.Rows.Count, 2) = arr
End Sub
0
30.04.2016, 18:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.04.2016, 18:55
Помогаю со студенческими работами здесь

Как составить проверку строки по регулярному выражению?
Как составить проверку строки по регулярному выражению? В строке должны быть латинские буквы/цифры,...

Получение строки по регулярному выражению
Мне нужно вырезать из строки строку(и), которая(ые) соответствовала(и) бы регулярному выражению.

Установить соответствие строки регулярному выражению
Нужно сделать чтобы при нахождении строки a(ba)*b* появлялось сообщение что строка соответствует...

Поиск номера строки по регулярному выражению
Всем доброго времени суток. Помогите, нужно найти номер строки по регулярному выражению. В виндусе...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru