Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / как подправить регулярное выражение / 15 сообщений из 15, страница 1 из 1
04.04.2013, 16:17
    #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
04.04.2013, 16:30
    #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
04.04.2013, 16:38
    #38213226
Saules
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как подправить регулярное выражение
извините, не дописал
в самом начале расширение убирается,т.к. может быть несколько вариантов

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


поэтому на проверку приходит
01888480030001002_20110609_TZP
или
01888480030001002_20110609_TZPS
...
Рейтинг: 0 / 0
04.04.2013, 16:43
    #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
04.04.2013, 16:56
    #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
04.04.2013, 17:26
    #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
04.04.2013, 17:49
    #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
04.04.2013, 17:57
    #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
04.04.2013, 17:59
    #38213410
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как подправить регулярное выражение
Еще тут: (BDPS) не нужны скобки.
...
Рейтинг: 0 / 0
04.04.2013, 21:16
    #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
04.04.2013, 22:57
    #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
05.04.2013, 12:21
    #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
05.04.2013, 12:28
    #38214201
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как подправить регулярное выражение
Вы читали описание функции IsNumeric?
...
Рейтинг: 0 / 0
05.04.2013, 12:44
    #38214220
Saules
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как подправить регулярное выражение
да, возвращает True или False
...
Рейтинг: 0 / 0
05.04.2013, 12:48
    #38214229
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как подправить регулярное выражение
Прочитайте тогда и про Val, CInt, CStr, CDate и т.п., это все скоро пригодится, мне кажется :)
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / как подправить регулярное выражение / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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