Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Есть ли в формулах Excel регулярные выражения? / 15 сообщений из 15, страница 1 из 1
04.02.2006, 09:07:34
    #33523397
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в формулах Excel регулярные выражения?
Добрый день!
Подскажите, пожалуйста, есть ли возможность задавать в ячейках Excel 2003 формулы с регулярными выражениями?
Насколько я в курсе, регулярные выражения можно испоьлзовать в макросах. Если так, то можно ли како-то их "вытащить" для использования в ячейках?
...
Рейтинг: 0 / 0
06.02.2006, 09:14:02
    #33524872
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в формулах Excel регулярные выражения?
регулярные выражения - это что?
типа конструкции With что ли?
...
Рейтинг: 0 / 0
06.02.2006, 11:32:50
    #33525300
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в формулах Excel регулярные выражения?
vkodorрегулярные выражения - это что?
типа конструкции With что ли?
Регулярное выражение
regex

В данном конкретном случае мне нужно выкусить из строки кусок по маске.
Но хотелось бы выяснить этот вопрос в целом.
...
Рейтинг: 0 / 0
06.02.2006, 14:14:32
    #33525904
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в формулах Excel регулярные выражения?
это подайдёт?
ПОИСК(искомый_текст;текст_для_поиска;нач_позиция)

ПОИСКБ(искомый_текст;текст_для_поиска;нач_позиция)

Искомый_текст — это искомый текст. Можно использовать символы шаблона знак вопроса (?) и звездочка (*) в аргументе искомый_текст. Знак вопроса соответствует любому символу; звездочка соответствует любой последовательности символов. Если нужно найти символ знак вопроса или звездочку, то следует поставить перед ними знак тильда (~). Если искомый_текст не найден, то возвращается значение ошибки #ЗНАЧ!.

Текст_для_поиска — это текст, в котором нужно найти искомый_текст.

Нач_позиция — это номер символа в тексте текст_для_поиска, с которого следует начать поиск.

Если аргумент опущен, то он полагается равным 1.


Если нач_позиция не больше 0 или больше, чем длина аргумента текст_для_поиска, то возвращается значение ошибки #ЗНАЧ!.
...
Рейтинг: 0 / 0
06.02.2006, 15:10:11
    #33526136
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в формулах Excel регулярные выражения?
vkodorэто подайдёт?
нет, не пойдет.
нужен поиск по сложному шаблону из латинских букв, цифр и пробелов.
...
Рейтинг: 0 / 0
06.02.2006, 15:26:20
    #33526196
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в формулах Excel регулярные выражения?
miksoft vkodorэто подайдёт?
нет, не пойдет.
нужен поиск по сложному шаблону из латинских букв, цифр и пробелов.

наверно только VBA
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
String Like Pattern- оператор для проверки строки String на маску Pattern. Это очень мощный оператор, почти аналог регулярных выражений в Perl. 

Пример:

Dim MyCheck
MyCheck = "aBBBa" Like "a*a" ' Возвратит True.
MyCheck = "F" Like "[A-Z]" ' Возвратит True.
MyCheck = "F" Like "[!A-Z]" ' Возвратит False.
MyCheck = "a2a" Like "a#a" ' Возвратит True.
MyCheck = "aM5b" Like "a[L-P]#[!c-e]" ' Возвратит True.
MyCheck = "BAT123khg" Like "B?T*" ' Возвратит True.
MyCheck = "CAT123khg" Like "B?T*" ' Возвратит False.

myString = "312T-87GD-8922"

If myString Like "###[A-Z]-##[A-Z][A-Z]-####" Then ... 

Спец-символы в маске:

? Любой одиночный символ
* Ноль или более символов
# Любая одиночная цифра ( 09 ).
[charlist] Любой одиночный символ в классе символов (списке)
[!charlist] Любой одиночный символ не принадлежащий классу символов
...
Рейтинг: 0 / 0
06.02.2006, 19:26:44
    #33526933
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в формулах Excel регулярные выражения?
miksoftНасколько я в курсе, регулярные выражения можно испоьлзовать в макросах. Если так, то можно ли како-то их "вытащить" для использования в ячейках?Ну никто ж не запрещает сделать публичную функцию :)
Код: plaintext
1.
2.
3.
4.
5.
Public Function MyMatch(r As Range, s As String) As Boolean
    Dim re As RegExp
    Set re = New RegExp
    re.Pattern = s
    MyMatch = re.Test(r.Text)
End Function
...
Рейтинг: 0 / 0
07.02.2006, 11:25:30
    #33527987
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в формулах Excel регулярные выражения?
White OwlНу никто ж не запрещает сделать публичную функцию :)
и после этого эту функцию можно будет использовать в формалах в ячейках?
...
Рейтинг: 0 / 0
07.02.2006, 18:21:31
    #33529582
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в формулах Excel регулярные выражения?
miksoft White OwlНу никто ж не запрещает сделать публичную функцию :)
и после этого эту функцию можно будет использовать в формалах в ячейках?
Да конечно. Пишешь =MyMatch(A1, "a*b") и получаешь TRUE/FALSE (или ИСТИНА/ЛОЖЬ для русского Экселя) если текст в ячейке A1 начинается на a и кончается на b.
Подробно используемый вариант регулярных выражений описан в доке на wsh.
...
Рейтинг: 0 / 0
07.02.2006, 19:27:19
    #33529785
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в формулах Excel регулярные выражения?
White OwlДа конечно. Пишешь =MyMatch(A1, "a*b")
Спасибо большое!

вот ведь... век живи - век учись!
сколько лет с Excel-ем дружу, а такой вещи не знал...
...
Рейтинг: 0 / 0
08.02.2006, 12:12:52
    #33530892
MX -- ALEX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в формулах Excel регулярные выражения?
White Owl miksoftНасколько я в курсе, регулярные выражения можно испоьлзовать в макросах. Если так, то можно ли како-то их "вытащить" для использования в ячейках?Ну никто ж не запрещает сделать публичную функцию :)
Код: plaintext
1.
2.
3.
4.
5.
Public Function MyMatch(r As Range, s As String) As Boolean
    Dim re As RegExp
    Set re = New RegExp
    re.Pattern = s
    MyMatch = re.Test(r.Text)
End Function

а так можно ?
Public Function MyMatch(r As Range, s As String) As Boolean
MyMatch = r.text like s
End Function
...
Рейтинг: 0 / 0
08.02.2006, 14:12:45
    #33531432
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в формулах Excel регулярные выражения?
MX -- ALEX White Owl miksoftНасколько я в курсе, регулярные выражения можно испоьлзовать в макросах. Если так, то можно ли како-то их "вытащить" для использования в ячейках?Ну никто ж не запрещает сделать публичную функцию :)
Код: plaintext
1.
2.
3.
4.
5.
Public Function MyMatch(r As Range, s As String) As Boolean
    Dim re As RegExp
    Set re = New RegExp
    re.Pattern = s
    MyMatch = re.Test(r.Text)
End Function

а так можно ?
Public Function MyMatch(r As Range, s As String) As Boolean
MyMatch = r.text like s
End Function

Public Function MyMatch(r As Range, s As String) As Boolean
MyMatch = r.Cells(1, 1).Text Like s
End Function
...
Рейтинг: 0 / 0
15.02.2006, 09:00:36
    #33545250
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в формулах Excel регулярные выражения?
Для использования регулярных выражений в своих программах, необходимо подключить библиотеку Microsoft Windows Script. Такая библиотека поставляется с IE4 (и выше). Для подключения, зайдите в Project->References и поставьте флажок у VBScript Regular Expressions. Теперь к Visual Basic добавился объект RegExp, который содержит в себе все, что нужно для работы с регулярными выражениями.

Как использовать объект объект RegExp?
Для начала, необходимо объявить объектную переменную RegExp:
Dim myRegExp As New RegExp

Этот объект имеет следующие свойства и методы:

Свойства:
Global - если Global = True, то поиск ведётся во всей строке, если False, то только до первого совпадения.
IgnoreCase - игнорировать ли регистр символов при поиске.
Pattern - это свойство задаёт шаблон (маску) для поиска.
MultiLine - определяет, является ли текст многострочным или нет.

Методы:

Test - этот метод имеет следующий синтаксис:
Function Test(sourceString As String) As Boolean

Метод Test позволяет протестировать строку sourceString на соответствие её шаблону (Pattern). Возвращается Boolean, True - соответсвует, False - нет.

Execute - этот метод имеет следущий синтаксис:
Function Execute(sourceString As String) As MatchCollection

MatchCollection - это коллекция совпадений, которая содержит в себе всю информацию о всех совпадениях регулярного выражения в строке sourceString. Метод Execute может быть использован, например, для извлечения всех email адресов из строки sourceString.

Replace - этот метод имеет следующий синтаксис:
Function Replace(sourceString As String, replaceVar) _
As String

Метод Replace даёт возможность заменить все совпадения регулярного выражения строкой replaceVar.

Примеры использования регулярных выражений

Dim myRegExp As New RegExp ' создаём экземпляр RegExp'a
myRegExp.MultiLine = False ' текст однострочный
myRegExp.Global = True ' будем проходить всю строку
myRegExp.IgnoreCase = True ' игнорируем регистр символов
myRegExp.Pattern = "<BODY (.*)</BODY>" ' маска

Dim aMatch As Match ' один из совпавших образцов
Dim colMatches As MatchCollection ' коллекция этих образцов
Dim testString As String ' тестируемая строка

testString = "<HTML><BODY bgcolor=#FFAABB>" & _
"<P>Это пример</P></BODY></HTML>" ' текст для теста

Set colMatches = myRegExp.Execute(testString) ' запускаем!

For Each aMatch In colMatches ' проходим по всей коллекции
List1.AddItem aMatch.FirstIndex
List1.AddItem aMatch.Length
List1.AddItem aMatch.SubMatches(0)
List1.AddItem aMatch.Value
Next aMatch

В результате выполнения такого кода в ListBox (List1) добавятся вот такие строчки:

Первая - число 6 (FirstIndex) - это номер первого совпавшего символа (т.е. симола b)

Вторая строка - 46 (Length) - длина совпавшего образца.

Третья строка:
"bgcolor=#FFAABB><P>Это пример</P>". Это первый совпавший образец (\1), т.е. текст, попавший в скобки (.*) в маске. Для \2 нужно смотреть SubMatches(1) и т.д.

И последняя строка:
"<BODY bgcolor=#FFAABB><P>Это пример</P></BODY>" - полный образец.

Теперь, давайте, к примеру, изменим маску (регулярное выражение) так, чтобы из текста получить hex цвет (#XXXXXX). Маска может выглядить так:

"(#[0-9A-F]{6})"

Запустите и посмотрите что будет. Свойство SubMatches(0) вернёт вам строку - "#FFAABB", т.е. как раз то, что мы искали. Кстати, свойство Value вернёт вам такую же строку.

Рассмотрим пример использования метода Test:

Dim myRegExp As New RegExp
myRegExp.MultiLine = False
myRegExp.Global = True
myRegExp.IgnoreCase = True
myRegExp.Pattern = "(#[0-9A-F]{6})"

testString = "<HTML><BODY bgcolor=#FFAABB>" & _
"<P>Это пример</P></BODY></HTML>"

If myRegExp.Test(testString) Then
MsgBox "Совпала!"
Else
MsgBox "Не совпала."
End If

Здесь мы проверяем, совпала ли строка с регулярным выражением или нет.

И наконец, последний пример. Давайте заменим текст, находящийся в тегах <P> на другой текст:

myRegExp.Pattern = "<P>(.*?)</P>"
testString = "<HTML><BODY bgcolor=#FFAABB>" & _
"<P>Это пример</P></BODY></HTML>"
List1.AddItem myRegExp.Replace(testString, _
"<P>Новый текст в теге P!</P>")

В данном случае в тестируемой строке будет только одна пара <P></P>. Но вы можете сами добавить ещё одну пару и проверить работоспособность кода.

Синтаксис регулярных выражений

На эту тему была выпущена книга "Mastering Regular Expressions". Более подробное описание вы можете найти на специализированных сайтах. (www.perl.com, к примеру).

Спец. символы:

Символ Назначение
* Множитель. Определяет ни одного или несколько символов, стоящих перед ним. Пример:
"ab*c" - символ a, затем ни одного или несколько символов b, и символ c.

. Точка - любой одиночный символ, кроме символа новой строки. Например:
"a." - символ a, за который следует любой одиночный символ.

[] Скобки использутся для задания класса символов. Например:
"[0-9A-F]" - соответствует одному hex символу. Заметьте, что 9-0 использовать нельзя! Символы должны идти обязательно по возрастающей.

[^] Класс отрицания. Например:
"[^A-Z]" - соответствует любому символу, крому любой заглавной латинской буквы.

\w Любой буквенно-циферный символ. Фактически аналог класса:

"[a-zA-Z0-9_]"

\W Аналог "[^a-zA-Z0-9_]"
\d Любая цифра: "[0-9]". Например
"\d\d\.\d\d\.\d\d\d\d" - соответствует дате. Заметьте, что перед точкой нужно поставить обратную косую черту \. Это говорит о том, что точку мы хотим интерпретировать именно как точку, а не как спец. символ - точку.

\D Аналог "[^0-9_]". Т.е. всё, кроме цифр.
\s Пробельный символ "[ \r\t\n\f]".
\S Непробельный символ "[^ \r\t\n\f]".
+ Тоже множитель (как и *), но определяет один или более символов. Например:

"ab+c" - символ a, один или более символов b и затем символ c.

? Прожорливость. Например, выше, для замены текста внутри тегов <p> мы использовали следующую маску: "<P>(.*?)</P>". После * мы поставили знак вопроса. Если бы мы этого не сделати, что произошла бы замена всего того, что находится от первого тега <p> до последнего </p>. А так, происходит замена только до следующего тега.


Ещё несколько примеров регулярных выражений:

"(два|три) богатыря"
соответствует как строке "два богатыря", так и "три богатыря".

".+@.+\..+" - соответствует email адресу.

"a(.)\1c" - соответствует одному символу a, затем любым 2-м одинаковым символам, и затем символу с. Т.е. совпадёт "axxc", то не "axyc".

"(\d\d)\.\1\.\d\d\d\d" - соответствует дате, у которой число и месяц одинаковы. Т.е. дата "09.09.2001" - подойдёт, а дата "09.12.2001" - нет. Ну и т.п.
...
Рейтинг: 0 / 0
15.02.2006, 09:18:10
    #33545292
MX -- ALEX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в формулах Excel регулярные выражения?
Ух-ты......
...
Рейтинг: 0 / 0
15.02.2006, 09:39:35
    #33545339
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в формулах Excel регулярные выражения?
MX -- ALEXУх-ты......
это из электронного справочника "vb_tutor_rus.chm"
раздел "полезные советы"
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Есть ли в формулах Excel регулярные выражения? / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]