Что нового

В Excel 2010 Regular Expressions не находит "&" как символ не из шаблона

Проводка

Новичок
Сообщения
6
Репутация
0
В Excel 2010 в большом объеме строк и столбцов нужно найти ячейки с недопустимыми символами. К допустимым символам относятся: a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 / - ? : ( ) . , ' + пробел.
Нашла в интернете, что для этого используются регулярные выражения. Пытаюсь написать функцию в VBA:

Код:
Public Function Rgx(astring As Range) As String

 Dim re As RegExp 'Regular Expressions (Регулярные выражения) - возможность работать со строками с использованием шаблонов
 Set re = New RegExp
 Dim tempString As String 'для промежуточных результатов
 
 re.Pattern = "[A-z]|[0-9]|\/|-|\?|\:|\(|\)|.|\,|\'|\+|\s)" 'Шаблон, допустимые символы
 re.Global = True 'True - проверка всего текста, False - проверка до первого соответствия
 re.IgnoreCase = False 'True - учитывать регистр, False - игнорировать регистр
   
 tempString = re.Test(astring) 'возвращает False, если строка не соответствует шаблону
 If tempString = False Then Rgx = "Недопустимый символ!" Else Rgx = "Хорошо"
   
End Function

Скажите, пожалуйста, почему данный код не находит недопустимый символ амперсанд "&" в ячейке с текстом "Pen&"? Если в ячейке только "&", то функция выдает результат "Недопустимый символ!".

 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Как бы это сказать...
Можно смело утверждать что вызываемая Вами функция на 100% работает правильно.
Код:
StringRegExp
Ищет в строке совпадения с образцом, заданным в виде регулярного выражения.

Строка "Pen&" несомненно содержит символ, допустимый Вашим регулярным выражением.

Если только что нашли в интернете упоминание о регулярных выражениях, то советую для начала ознакомиться с литературой
Уроки по работе с Регулярными Выражениями (RegExp)
 
Автор
П

Проводка

Новичок
Сообщения
6
Репутация
0
Спасибо. Я смотрела предложенные Вами уроки перед созданием темы. А до этого много искала в интернете по поводу амперсанда в шаблоне. Но не смогла понять, где в моем шаблоне спрятан амперсанд. Может быть там и еще какие-то символы спрятаны((.


Добавлено:
Сообщение автоматически объединено:

Если в шаблоне спрятан &, почему тогда находит этот недопустимый символ в ячейке с текстом "&" (Рисунок в моем первом сообщении)?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Потому что у вас . не экранирован. Потому что конструкция | (или) найдет [A-z] в строке &Pen и на этом завершит разбор.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Но не смогла понять, где в моем шаблоне спрятан амперсанд

Потому что Вы не совсем правильно трактуете использование регулярного выражения.
Ваш запрос проверяет не наличие в строке запрещённого символа, а наличие разрешённого.
В строке &Pen есть подстрока подходящая под шаблон.
В строке & нет подстроки подходящей под шаблон.
 
Автор
П

Проводка

Новичок
Сообщения
6
Репутация
0
Спасибо, поняла. Все разрешенные символы перечислить не смогу, т.к. не знаю их всех. Возможно ли в таком случае использование регулярного выражения?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Вам нужно рассуждать так. Во всей строке от начало и до конца, должны быть только допустимые символы. Начало строки обозначается ^, конец $ (в Excel конечно может отличатся), допустимые символы перечисляются в группе [] и повторяются хотя бы 1 раз.
Еще нужно помнить, что между A и z в выражении A-z, числятся такие символы: [\]^_`

Вам нужно такой шаблон: ^[A-Za-z\d/?:().,'+ -]+$
 
Автор
П

Проводка

Новичок
Сообщения
6
Репутация
0
Отвлеклась немного на другое. Спасибо огромное, по Вашему шаблону работает! Сейчас буду вникать, что в нем написано. Еще напишу.


Добавлено:
Сообщение автоматически объединено:

Скажите, пжл, что означает последний "+" шаблона?



Добавлено:
Сообщение автоматически объединено:

между A и z в выражении A-z, числятся такие символы: [\]^_`
Тогда так:
re.Pattern = "^[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\d/?:().,'+ -]+$"


Добавлено:
Сообщение автоматически объединено:

Еще смотрю, где же закодировано, что пробел допустим?
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Проводка сказал(а):
Все разрешенные символы перечислить не смогу, т.к. не знаю их всех. Возможно ли в таком случае использование регулярного выражения?
Для того, чтобы составить регулярное выражение, вам надо знать все разрешённые, либо все неразрешенные.
И не надо перечислять abcde....z, достаточно указать a-z. Тоже самое с большими буквами.
 
Автор
П

Проводка

Новичок
Сообщения
6
Репутация
0
Все разрешенные известны, указаны в моем первом сообщении.
"между A и z в выражении A-z, числятся такие символы: [\]^_`", поэтому перечислила буквы.


Добавлено:
Сообщение автоматически объединено:

Поняла. Спасибо. Буду использовать A-Za-z.


Добавлено:
Сообщение автоматически объединено:

"+" обозначает соответствие данному выражению один или более раз. А вот где спрятан допустимый пробел?
 
Верх