powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / как подправить регулярное выражение
15 сообщений из 15, страница 1 из 1
как подправить регулярное выражение
    #38213189
Saules
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго всем дня
подскажите как правильно написать регулярное выражение, чтобы проверялись точные условия в названии файлов?
например:

1. „17 цифр”_”8 цифр”_TZP.dgn
2. „17 цифр”_”8 цифр”_TZPS.dgn

сейчас получается так, что если название файла такое:
01888480030001002_20110609_TZP.dgn
то он заходит и проходит проверку на rex.Pattern = "^\d{17}_\d{8}_TZP$"
а если файл называется
01888480030001002_20110609_TZPS.dgn
то он заходит и проходит проверку rex.Pattern = "^\d{17}_\d{8}_TZPS$", но почему-то еще и заходит на проверку rex.Pattern = "^\d{17}_\d{8}_TZP$" и в этом случае выдается результат Not Valid TZP.
что надо исправить чтобы проверка на шаблоне делалась только в случае полного соответствия в названии?

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
  tzp = "TZP"
  tzps = "TZPS"
  
    check = InStr(str, tgp)
  If check <> 0 Then
    Set rex = CreateObject("VBScript.RegExp")
    rex.Pattern = "^\d{17}_\d{8}_TZP$"
     If rex.Test(str) Then
      Debug.Print "Valid TZP"
    Else
      Debug.Print "Not Valid TZP"
    End If

  End If
  
   check = InStr(str, tgps)
  If check <> 0 Then
    Set rex = CreateObject("VBScript.RegExp")
    rex.Pattern = "^\d{17}_\d{8}_TZPS$"
     If rex.Test(str) Then
      Debug.Print "Valid TZPS"
    Else
      Debug.Print "Not Valid TZPS"
    End If

  End If
...
Рейтинг: 0 / 0
как подправить регулярное выражение
    #38213212
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то вообще не понятно, как это работает. .dgn-то не учитывается.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    rex.Pattern = "^\d{17}_\d{8}_TZP(S)?\.dgn$"
    Set m = rex.Execute(s)
    If m.Count = 0 Then
        Debug.Print "Not Valid TZP(S)"
    Else
        If IsEmpty(m(0).SubMatches(0)) Then
            Debug.Print "Valid TZP"
        Else
            Debug.Print "Valid TZPS"
        End If
    End If
...
Рейтинг: 0 / 0
как подправить регулярное выражение
    #38213226
Saules
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
извините, не дописал
в самом начале расширение убирается,т.к. может быть несколько вариантов

Код: vbnet
1.
str = Left(sFileName, InStrRev(sFileName, ".") - 1)


поэтому на проверку приходит
01888480030001002_20110609_TZP
или
01888480030001002_20110609_TZPS
...
Рейтинг: 0 / 0
как подправить регулярное выражение
    #38213240
Saules
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и еще там может быть 3 других вариантов "концовки" названия файла
rex.Pattern = "^\d{11}_\d{8}_OP$"
rex.Pattern = "^\d{11}_\d{8}_BCS$"
rex.Pattern = "^\d{14}_\d{8}_BDPS$"
поэтому для каждого варанта сделана своя проверка

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 x= "конец_названия"
  
    check = InStr(str, x)
  If check <> 0 Then
    Set rex = CreateObject("VBScript.RegExp")
    rex.Pattern = "^\d{17}_\d{8}_конец_названия$"
     If rex.Test(str) Then
      Debug.Print "Valid конец_названия"
    Else
      Debug.Print "Not Valid конец_названия"
    End If

  End If


наверное, это можно как-то оптимизировать, но пока не знаю как
...
Рейтинг: 0 / 0
как подправить регулярное выражение
    #38213270
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
    rex.Pattern = "^\d{17}_\d{8}_(TZPS|TZP|OP|BCS|BDPS)\.[^\.]+$"

    If m.Count = 0 Then
        Debug.Print "Nothing Valid"
    Else
        Debug.Print "Valid " & m(0).SubMatches(0)
    End If
...
Рейтинг: 0 / 0
как подправить регулярное выражение
    #38213335
Saules
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy
спасибо, это был бы идеальный вариант , если бы в первой части всегда должно было бы быть 17 цифр. но там, в зависимости, от концовки названия может быть и 11 и 14
„11 цифр”_”8 цифр”_OP.dgn
„17 цифр”_”8 цифр”_TZP.dgn
„11 цифр”_”8 цифр”_BCS.dgn
„14 цифр”_”8 цифр”_BDPS.dgn
„17 цифр”_”8 цифр”_TZPS.dgn
так что в одном шаблоне никак не уместить все сразу
...
Рейтинг: 0 / 0
как подправить регулярное выражение
    #38213386
Saules
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тьфу, вот балда!
Код: vbnet
1.
 rex.Pattern = "^\d{17}_\d{8}_(TZPS|TZP)|\d{11}_\d{8}_(OP|BCS)|\d{14}_\d{8}_(BDPS)$"


еще раз спасибо
...
Рейтинг: 0 / 0
как подправить регулярное выражение
    #38213408
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Saulesтьфу, вот балда!
Код: vbnet
1.
 rex.Pattern = "^\d{17}_\d{8}_(TZPS|TZP)|\d{11}_\d{8}_(OP|BCS)|\d{14}_\d{8}_(BDPS)$"

Не уверен, что это правильно. По-моему (TZPS|TZP)|\d{11} будет воспринято как "TZPS или TZP или 11 цифр". Лучше так:
Код: vbnet
1.
rex.Pattern = "^(\d{17}_\d{8}_(TZPS|TZP))|(\d{11}_\d{8}_(OP|BCS))|(\d{14}_\d{8}_(BDPS))$"



Фигурные скобки, кстати, могут задавать диапазоны.
Код: vbnet
1.
rex.Pattern = "^\d{11,17}_\d{8}_(TZPS|TZP|OP|BCS|BDPS)\.[^\.]+$"
...
Рейтинг: 0 / 0
как подправить регулярное выражение
    #38213410
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще тут: (BDPS) не нужны скобки.
...
Рейтинг: 0 / 0
как подправить регулярное выражение
    #38213635
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Saules Antonariy
спасибо, это был бы идеальный вариант , если бы в первой части всегда должно было бы быть 17 цифр. но там, в зависимости, от концовки названия может быть и 11 и 14
„11 цифр”_”8 цифр”_OP.dgn
„17 цифр”_”8 цифр”_TZP.dgn
„11 цифр”_”8 цифр”_BCS.dgn
„14 цифр”_”8 цифр”_BDPS.dgn
„17 цифр”_”8 цифр”_TZPS.dgn
так что в одном шаблоне никак не уместить все сразу
ИМХО: не надо всё в один шаблон..
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
dim k&, str$, sfx$
dim pattern$, re

set re = createobject("vbscript.regexp")

str = {имя файла без расширения}
k = instrrev(str,"_")

if k > 0 then
  sfx = mid$(str, k +1)

  select case sfx
  case "OP", "BCS"
    pattern = "^\d{11}_\d{8}_"

  case "TZP", "TZPS"
    pattern = "^\d{17}_\d{8}_"

  case "BDPS"
    pattern = "^\d{14}_\d{8}_"

  else: k = 0
  end select

  if k > 0 then re.pattern = pattern & sfx & "$": k = clng( re.test(str) )
end if

if k = 0 then
  debug.print "E: invalid filename " & str
else
  debug.print ,str
end if



...
Рейтинг: 0 / 0
как подправить регулярное выражение
    #38213706
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да ну их вообще, регулярных :D
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Function Check(str$) As Boolean
Dim a$(), n&
a = Split(str, "_")
If UBound(a) = 2 Then
  If Len(a(1)) = 8 And IsNumeric(a(0)) And IsNumeric(a(1)) Then
    Select Case Len(a(0))
    Case 11: Check = a(2) = "OP" Or a(2) = "BCS"
    Case 14: Check = a(2) = "BDPS"
    Case 17: Check = a(2) = "TZP" Or a(2) = "TZPS"
    End Select
  End If
End If
End Function


Sub test()
Debug.Print Check("01888480030001002_20110609_TZP") 'True
Debug.Print Check("1888480030001002_20110609_TZP")  'False
End Sub
...
Рейтинг: 0 / 0
как подправить регулярное выражение
    #38214188
Saules
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Казанский
спасибо за отличный вариант!
остался последний вопрос:
если еще возможны варианты названий
01000510145001_20101203_IX_99 (от 0 до 99,но не больше)
и
01000510145001_20101203_SX_X99(от 0 до 99,но не больше)
то как проверять в этом случае?
этот вариант не работает
Код: vbnet
1.
And IsNumeric(a(3)) <= 99



Код: vbnet
1.
2.
3.
4.
5.
6.
 ElseIf UBound(a) = 3 Then
    If Len(a(1)) = 8 And IsNumeric(a(0)) And IsNumeric(a(1)) And (IsNumeric(a(3)) And IsNumeric(a(3)) <= 99) Then
    Select Case Len(a(0))
    Case 14: CheckName =  a(2) = "IX"   or a(2) = "X"     
    End Select
  End If
...
Рейтинг: 0 / 0
как подправить регулярное выражение
    #38214201
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы читали описание функции IsNumeric?
...
Рейтинг: 0 / 0
как подправить регулярное выражение
    #38214220
Saules
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да, возвращает True или False
...
Рейтинг: 0 / 0
как подправить регулярное выражение
    #38214229
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочитайте тогда и про Val, CInt, CStr, CDate и т.п., это все скоро пригодится, мне кажется :)
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / как подправить регулярное выражение
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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