Функция InStrRev - поиск последнего вхождения подстроки — КиберПедия 

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Функция InStrRev - поиск последнего вхождения подстроки

2020-08-21 40
Функция InStrRev - поиск последнего вхождения подстроки 0.00 из 5.00 0 оценок
Заказать работу

Функция InStrRev симметрично дополняет функцию InStr, аналогично тому, как функция Right дополняет функцию Left. Эта функция ищет вхождение подстроки в строку, но начинает свою работу с правого конца строки. Ее использование может существенно ускорить работу, если заранее известно, что искомая подстрока находится где-то в конце строки-источника. Если вхождение искомой подстроки единственно, то обе функции дают один и тот же результат. При множественном вхождении функция InStr возвращает первое вхождение, в то время как InStrRev - последнее. Ее синтаксис:

InstrRev(stringcheck, stringmatch[, start[, compare]])

Ее параметры имеют тот же смысл, что и у функции InStr, но порядок их задания изменен. Необязательный параметр Start задается третьим по счету. Когда он опущен, то, по умолчанию, его значение равно "-1", и поиск начинается с последнего символа. Если вернуться к последнему примеру, то для решения нашей содержательной задачи требовалось определить первое и последнее вхождение символа "\" в строке, задающей путь к файлу. Поэтому обе функции были весьма кстати. Нужно отметить, что это весьма типичная ситуация при разборах текста.

Функция Replace - замена всех вхождений подстроки

Позволяет заменить не только первое вхождение искомой подстроки, но и все такие вхождения, не требуя организации цикла. С другой стороны, можно ограничиться только заменой первого или нескольких первых вхождений. Рассмотрим синтаксис появившейся функции:

Replace(expression, find, replace[, start[, count[, compare]]])

Первый аргумент expression задает строковое выражение, результат которого определяет строку-источник, в которой осуществляется замена. Аргументы find и Replace задают заменяемую подстроку и ее новое значение. Аргумент Count определяет число замен. Обычно он равен 1, когда речь идет о замене первого вхождения, или опускается, - в этом случае его значение по умолчанию равно "-1", означающее замену всех вхождений. Аргумент compare имеет обычный смысл.

В качестве примера приведем функцию Rep. При копировании программного текста в документ Word появляются последовательности пробелов, отражающие структурную запись процедур и функций. Но появление в документах Word двух пробелов подряд считается смертельным грехом. Заменять пробелы табуляцией можно и руками, но, конечно же, лучше написать макрос, решающий эту и другие задачи по приведению текста в форму, требуемую редакцией. Вот текст функции, используемой для этих целей:

Public Sub Rep()

'Эта процедура преобразует выделенный программный текст

'Заменяя пробелы табуляцией и конец абзаца мягким концом строки

   Dim TxtRange As String

 

   TxtRange = Selection.Range.Text

   'Замена пробелов: 4-х, 3-х и 2-х символом табуляции

   TxtRange = Replace(TxtRange, " ", vbTab)

   TxtRange = Replace(TxtRange, " ", vbTab)

   TxtRange = Replace(TxtRange, " ", vbTab)

 

   'Замена концов абзаца

   Selection.Range.Text = Replace(TxtRange, VBA.Chr(13), VBA.Chr(11))

End Sub

 

У Replace есть одна особенность, на которую следует обратить внимание, - возвращаемый ею результат, начинается не с первой позиции, а с позиции, заданной аргументом Start. Так что помимо своей основной роли она еще обрубает голову строки, если только Start, отличается от 1. Поскольку замену зачастую нужно производить не с самого начала, а получать хочется полную строку, то мы написали свой вариант этой функции:

Public Function MyReplace(ByVal Expr As String, ByVal find As String, _

          ByVal rep As String, Optional ByVal start As Long = 1, Optional

          ByVal count As Long = -1, _

          Optional ByVal compare As VbCompareMethod = vbBinaryCompare) As String

        

   'Вызов стандартной функции Replace

   If start = 1 Then

          MyReplace = replace(Expr, find, rep, start, count, compare)

   Else

          MyReplace = VBA.Left(Expr, start - 1) & replace(Expr, find,

          rep, start, count, compare)

   End If

End Function

 

Вот результаты нескольких вызовов Replace и MyReplace в окне отладки:

? Replace("A+B *(D*B +B)","B","C",4,1)

 *(D*C +B)

? MyReplace("A+B *(D*B +B)","B","C",4,1)

A+B *(D*C +B)

? MyReplace("A+B *(D*B +B)","B","C",4)

A+B *(D*C +C)

Удаление подстроки

Удаление вхождений подстроки в строку также является одной из основных операций над строками. Хотя специальной встроенной функции DelStr не появилось, но написать ее реализацию, имея Replace, совсем просто. Удалить подстроку эквивалентно замене ее пустой подстрокой. Вот текст, написанной нами функции DelStr:

Public Function DelStr(ByVal Expr As String, ByVal find As String, _

          Optional ByVal start As Long = 1, Optional ByVal count As Long = -1, _

          Optional ByVal compare As VbCompareMethod = vbBinaryCompare)

       

   'Вызов функции MyReplace с пустой строкой для замены

   DelStr = MyReplace(Expr, find, "", start, count, compare)

End Function

 

Приведем результаты ее вызовов в окне отладки:

? DelStr("T* + U** - V*","*")

T + U - V

? DelStr("T* + U** - V*","*",5)

T* + U - V

? DelStr("T* + U** - V*","*",5,1)

T* + U* - V*

Заметьте, при определении DelStr мы предпочли пользоваться собственной модификацией MyReplace, поскольку, как нам кажется, она в большей степени отвечает сути дела.


Поделиться с друзьями:

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.012 с.