Есть ли простой способ проверить, начинается ли строка с букв (любые 4 буквы)? - PullRequest
1 голос
/ 23 декабря 2019

есть ли способ проверить, начинается ли строка любыми 4 буквами. Я ищу что-то вроде этого:

If string like "####*" then
'DO STUFF
end if

"#" для цифр, мне нужно то же самое, но только для букв. Можно ли это сделать без regEx?

Ответы [ 5 ]

4 голосов
/ 23 декабря 2019

Я не знаю способа сделать это без использования регулярных выражений. Мы можем попробовать использовать регулярное выражение Test вместе с шаблоном ^[A-Z]{4}.*$:

Dim input As String
Dim regex As Object
Set regex = New RegExp

regex.Pattern = "^[A-Z]{4}.*$"
input = "ABCD blah"

If regex.Test(input) Then
    'DO STUFF
End If
3 голосов
/ 23 декабря 2019

Можно ли это сделать без regEx?

Да, для Regular Expressions нет особой необходимости, поскольку оператор Like вполне способен, как некоторыев крайнем случае, чтобы справиться с ситуацией, как объясняет автор этой статьи. Кроме того, RegEx довольно медленно работает с большой базой данных. Тем не менее, RegEX - отличный инструмент для использования!

Решение, предоставленное @ AlexandruHapco , сообщит вам, если строка начинается с 4 заглавных букв. Но чтобы учесть нижнее ИЛИ верхнее, вы можете расширить эту логику:

If str Like "[a-zA-Z][a-zA-Z][a-zA-Z][a-zA-Z]*" Then

Однако, чтобы сократить это немного, мы можем использовать [!charlist], чтобы сообщить оператору, которого мы ищемчто-то, что не в указанном диапазоне. Другими словами, мы могли бы использовать:

If str Like "[!0-9][!0-9][!0-9][!0-9]*" Then

Это последнее решение не будет работать, если в вашей строке есть другие символы, кроме буквенно-цифровых символов.

3 голосов
/ 23 декабря 2019

Вы можете сделать это с Like почти так же, как с RegEx.

"{#}" - не существует в операторах Like, но "[AZ]" абсолютно допустимо

if string like "[A-Z][A-Z][A-Z][A-Z]*" then
   'DO STUFF
end if
1 голос
/ 27 декабря 2019

Подход с использованием функции FilterXML

Функция WorksheetFunction FilterXML() была добавлена ​​в ►Excel 2013 и позволяет указать любую XPath строку поиска дляданный XML-документ, который не должен быть локально сохраненным файлом (для которого требуется функция WebService()), но может быть строкой в ​​ правильно сформированных открывающих и закрывающих узлах, т.е. нашей тестовой строке с некоторыми простыми добавлениями узлов(частично сопоставимо со структурой html).

Пример вызова

Sub TextXML()
Dim myString As String
myString = "ABCD blah"
If check(myString) Then
   'DO STUFF
   Debug.Print "okay"
Else
   Debug.Print "oh no"
End If
End Sub

Функция справки

Function check(ByVal teststring As String) As Boolean
    Const s As String = Chr(185)  ' unusual character, e.g. Chr(185): "¹"
    On Error GoTo oops
    If Len(WorksheetFunction.FilterXML("<all><i>" & teststring & "</i></all>", "//i[substring(translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','" & _
       String(26, s) & "'),1,4)='" & String(4, s) & "']")) > 0 Then check = True
    Exit Function
oops:
    Err.Clear
End Function

tl; tr - как использовать VBA в версиях Excel до 2013 года

Ради искусства классический способ использования XPath с помощью методов XMLDOM:

Примервызов

Sub TextXML2()
Dim myString As String
myString = "ABCD blah"

If check2(myString) Then
   'DO STUFF
   Debug.Print "okay"
Else
   Debug.Print "oh no"
End If
End Sub

Функции справки

Function check2(ByVal teststring As String) As Boolean
' Purpose: check if first 4 characters of a test string are upper case letters A-Z
  ' [0] late bind XML document
    Dim xDoc As Object
    Set xDoc = CreateObject("MSXML2.DOMDocument.6.0")
  ' [1] form XML string by adding opening and closing node names ("tags")
    teststring = "<all><i>" & teststring & "</i></all>"
  ' [2] load XML
    If xDoc.LoadXML(teststring) Then
      ' [3a] list matching item(s) via XPath
        Dim myNodeList As Object
        Set myNodeList = xDoc.SelectNodes(XPath())
            'Debug.Print teststring, " found: " & myNodeList.Length
      ' [3b] return true if the item matches, i.e. the list length is greater than zero
        If myNodeList.Length > 0 Then check2 = True
    End If

End Function

Function XPath() As String
' Purpose: create XPath string to get nodes where the first 4 characters are upper case letters A-Z
' Result: //i[substring(translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹'),1,4)="¹¹¹¹"]
  ' get UPPER case alphabet
    Const ABC     As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  ' define replacement string consisting of an unusual character repeated 26 times
    Const UNUSUAL As String = "¹"       ' << replace by your preferenced character
    Dim replacement As String: replacement = String(Len(ABC), UNUSUAL)
    'return XPath string
    XPath = "//i[substring(translate(.,'" & ABC & "','" & replacement & "'),1,4)=""" & String(4, UNUSUAL) & """]"
End Function

0 голосов
/ 23 декабря 2019

Чтобы проверить несколько символов - в данном случае первые 4 буквы - вы всегда можете сделать следующее:

If Not (Mid(string, 1, 1) Like "#" And Mid(string, 2, 1) Like "#" _ 
    And Mid(string, 3, 1) Like "#" And Mid(string, 4, 1) Like "#") Then  
    ' DO STUFF
End If

Это немного больше, чем при использовании оператора Like, но такчто? Кроме того, вы можете использовать Select Case в цикле ... Другой вариант - использовать IsNumeric(Mid(string, i, 1)) вместо Mid(string, i, 1) Like "#" и т. Д.

Конечно, этот подход все еще довольно практичен с 4 символами, ноне такой гибкий и очень не масштабируемый, как RegEx.

...