Любое слово содержит только буквы, цифры, подчеркивания и точки - PullRequest
0 голосов
/ 14 апреля 2020

Я хотел бы написать шаблон для функции Like в VBA для проверки Любое слово, содержащее только буквы, цифры, подчеркивания и точки .

Я мог бы написать как [A-Za-z0-9_,] который валидирует персонажа. Но [A-Za-z0-9_,]+ похоже не проверяет ни слова. Может ли кто-нибудь помочь?

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Обычно в регулярных выражениях используется следующее правило: слово char представляет собой либо букву (верхний или нижний регистр), либо di git, либо "_ "(подчеркивание).

Но вы пишете, что в вашем смысле слово может содержать также точку (и, как я предполагаю, также другие" небелые "символы).

Из этого набора слов вы определяете допустимые слова на самом деле как [\ w.] + , где:

  • \w соответствует буквам, цифры и "_",
  • . совпадают.

Единственное, что нужно добавить - это граничные условия, чтобы гарантировать, что шаблон не соответствует части слова, то есть:

  • до начала текста или любого белого символа (положительный взгляд за спиной),
  • после конца текста или любой белый символ (положительный взгляд).

Итак, мое предложение:

(?<=^|\s)[\w.]+(?=\s|$)

Обратите внимание, что \b якоря не могут быть помещены вместо обоих моих взглядов, так как они буду не работает, если точка является первым или последним символом в вашем слове.

Шаблон, подобный [A-Za-z0-9_,], как предложено в другом ответе, также неверен, по той же причине.

В По моему мнению, концепция использования Like также неверна, так как она не учитывает оба «граничных условия» (обходные пути), и вы все равно должны использовать просто регулярное выражение.

1 голос
/ 14 апреля 2020

Вы дали понять, что хотите использовать только Like, что, IMHO, не лучший вариант для вас. Лучше всего использовать Regex (как вы отметили себя). Но не путайте их, так как с Like нет таких модификаторов, как +. Вам нужно будет констатировать шаблон за символа. Поэтому вместо очень удобного [A-Za-z0-9_,]+ вам понадобится что-то вроде: [A-Za-z0-9_,][A-Za-z0-9_,][A-Za-z0-9_,]..etc.., которое равно длине вашего строкового значения.

Таким образом, одним из вариантов будет:

Dim str As String: str = "Test_1,."
Dim pattern As String

pattern = Replace(Space(Len(str)), " ", "[A-Za-z0-9_,]")
If str Like pattern Then
    Debug.Print "Check"
Else
    Debug.Print "Nope"
End If

Другим способом будет перебирать вашу строку для каждого символа:

Dim str As String: str = "Test_1,3"
Dim pattern As String: pattern = "[A-Za-z0-9_,]"

For x = 1 To Len(str)
    If Not Mid(str, x, 1) Like pattern Then
        Debug.Print "Nope"
        Exit Sub
    End If
Next x
Debug.Print "Check"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...