powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / regexp уменьшить количество вариаций при проверке
51 сообщений из 51, показаны все 3 страниц
regexp уменьшить количество вариаций при проверке
    #37234017
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имею некий набор слов
(a1, a2, a3, a4....) значений много

эти слова в различных комбинациях могут появляться в тексте разделённые запятой
каждое из слов появляется единожды и их порядом не меняется
то есть если имеются a2 и a1 то a1 всегда раньше
запятой в самом конце быть не может

a1,a2,a3 - правильно
a2,a3 - правильно
a1,a4 - правильно

a1,uu,a3 - не правильно
a1, - не правильно
a2,a1 - не правильно

вопрос
можно ли не создавая все варианты проверить через регулярное выражение корректность теста ?

Спасибо
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37234407
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Канечно!
Код: plaintext
^(a1)?(?<=[$,]),)(a2)?(?<=[$,]),)(a3)?$
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37234412
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, опечатка...
Код: plaintext
^(a1)?(?<=[^,]),)(a2)?(?<=[^,]),)(a3)?$
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37234421
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёёёёё... опять опечатка....

^(a1)?((?<=[^,]),)(a2)?((?<=[^,]),)(a3)?$

Хотя мне почему-то начало казаться, что ответ на первоначальный вопрос будет "нет". Потому что без look-around шаблнов как мне кажется задачу не решить, а их в убогом VB не знают.
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37234562
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет не так надо

могут быть варианты

a1
a1,a2
a1,a2,a3
a1,a3
a2
a3
a2,a3

если значений больше то и вариантов тоже жутко много

использую такой вариант
(a1)?((?<=[^,]),)(a2)?((?<=[^,]),)(a3)?
но работает только
a1,a2,a3 это правильно
a1,a2, - а это не правильно
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37234579
сккотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
michael R,
"в три прохода" на убогом VB.
интересно - взлетит, не взлетит...
Код: plaintext
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
Const s0$ = "a1|a2|a3|...|aN"                  ' <--перечень слов, разделенный "|"
Const s2$ = "aN,)*.*(aN-1,)*.*...(a2,)*.*(a1"  ' <--перечень слов, в обратном порядке разделенный ",)*.*("

Dim sTEXT$ ' <-- в эту пременную загрузить текст для проверки
           '     как - дело хозяйское (можно частями)

Dim sFind$, sTest$
Dim re1, re2, re3
Dim oMatches, match
Dim i%, iWrongText%

sFind = s0

Set re1 = CreateObject("vbscript.regexp")
re1.Global = True               ' искать все вхождения
re1.IgnoreCase = True           ' игнорировать регистр символов

' ищем знакомые слова
re1.Pattern = " (" & s0 & ").* "    ' поиск частей текста отделеных пробелами
                                    ' в которых первое слово - одно из знакомых
Set oMatches = re1.Execute(sTEXT)

If oMatches.Count =  0  Then
    MsgBox "савсем хароший текст - ни одного знакомого слова"
    iWrongText =  12 
Else
    ' нашли знакомые слова,
    ' теперь будем искать незнакомые среди знакомых <-- каламбур на
    sFind = Replace(s0, "|", ",|")
    
    Set re2 = CreateObject("vbscript.regexp")
    re2.Global = False              ' искать первое вхождение
    re2.IgnoreCase = True           ' игнорировать регистр символов
    
    re2.Pattern = ".*(!=" & sFind & ").*"   ' поиск незнакомых слов в найденных частях

    ' возможно, создание третьего объекта излишне и можно было бы использовать re1
    Set re3 = CreateObject("vbscript.regexp")
    re3.Global = False              ' искать первое вхождение
    re3.IgnoreCase = True           ' игнорировать регистр символов
    
    re3.Pattern = "(" & s2 & ",)*"          ' проверка порядка слов
    
    For i =  0  To oMatches.Count -  1 
        Set match = oMatches.Items(i)
        sTest = Trim$(match.Value) & ","
        
        If re2.Test(sTest) Then
            MsgBox "плахой текст - знакомые слова вперемешку с незнакомыми"
            iWrongText =  22 
        ElseIf re3.Test(sTest) Then
            MsgBox "савсем плахой текст - знакомые слова не в том порядке"
            iWrongText =  44 
        End If
        
        Set match = Nothing
        If iWrongText Then Exit For
    Next i
    
    Set re2 = Nothing
    Set re3 = Nothing
End If

Set oMatches = Nothing
Set re1 = Nothing
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37234667
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
michael Rнет не так надо

могут быть варианты

a1
a1,a2
a1,a2,a3
a1,a3
a2
a3
a2,a3

если значений больше то и вариантов тоже жутко много

использую такой вариант
(a1)?((?<=[^,]),)(a2)?((?<=[^,]),)(a3)?
но работает только
a1,a2,a3 это правильно
a1,a2, - а это не правильно
Нуууу.. забыл look-behind после запятой добавить:

(a1)?((?<=[^,]),(?=[^,]))(a2)?((?<=[^,]),(?=[^,]))(a3)?

А может быть проще прогнать строку через split с последующим сравнением полученного массива строк с массивом эталонных строк?
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37234681
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlНуууу.. забыл look-behind после запятой добавить:

(a1)?((?<=[^,]),(?=[^,]))(a2)?((?<=[^,]),(?=[^,]))(a3)?
...
Теперь представь полсотни слов в списке. Придется регулярку писать для проверки правильно ли составлен паттерн
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37234876
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(a1)?((?<=[^,]),(?=[^,]))(a2)?((?<=[^,]),(?=[^,]))(a3)?

всё равно не то

вариант
a1 не работает
a1,a2 не работает

возможные варианты для 3-х значений
a1
a2
a3
a1,a2
a1,a3
a2,a3
a1,a2,a3

у меня 14 таких значений
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37234923
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
michael R,
10570514 не пробовали?
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37234938
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
michael R,
10570514 не пробовали?

пробовал
это не то
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37234944
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
michael R,
на каком шаге спотыкается?
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37234946
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
варианты

a1
a1,a2
вообще не срабатывают когда выбираю 3 значения
думаю там вообще логика другая
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37234950
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
michael R,
если текст и набор слов для проверки не top secret, - было бы интересно поковырять. Самому набирать тесты лень, сорри.
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37234957
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотищаWhite OwlНуууу.. забыл look-behind после запятой добавить:

(a1)?((?<=[^,]),(?=[^,]))(a2)?((?<=[^,]),(?=[^,]))(a3)?
...
Теперь представь полсотни слов в списке. Придется регулярку писать для проверки правильно ли составлен паттерн Это ты не мне говори. Я регулярки использую только там где надо :)
Это michael R любит их всюду совать. Не верит что это не панацея и часто намного проще и эффективнее прогнать строку цикл из InStr().
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37234958
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДА НЕТУ СЕКРЕТА

сами слова это расширения для домейнов (TLD)

как варианты
com
com;;net;;org
com;;org
net;;org

таких слов 14-15
каждый из слов появляется один раз
всех вариантов получается несколько тысяч


такие варианты ошибка
com;;net;;
com;;
zzz
bbb;

просто нужна проверка
желательно одним этапом
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37234964
crerjnbof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
michael RДА НЕТУ СЕКРЕТАЯ скромно надеялся получить проверяемый текст и тестовую строку (набор "правильных" слов в правильном порядке)...
Если правильно понял - то не судьба :(
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37234969
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я скромно надеялся получить проверяемый текст и тестовую строку (набор "правильных" слов в правильном порядке)...
Если правильно понял - то не судьба :(

я же дал
проверяемые тексты
правильные и неправильные
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37234971
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
michael R...
эти слова в различных комбинациях могут появляться в тексте разделённые запятой...Ай, шайтан, савсем запутал!(с)
Конечно, мой велосипед по ';;' в качестве разделителя не поедет.
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37234973
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЗЫ: "правильные слова"==набор из TLD, это понятно. Непонятно - "правильный порядок" "правильных слов", проверяемый текст.
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37235082
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЗЫ: "правильные слова"==набор из TLD, это понятно. Непонятно - "правильный порядок" "правильных слов", проверяемый текст.

хорошо забей на правильный порядок
как следуют слова не важно

главное что каждое слово может появится не больше одного раза
слова должны разделятся (у меня например ";;")
текст правильный если в нём есть только TLD и разделитель(и)

но мне кажется что такое сделать невозможно
а писать все варианты просто убиться
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37235099
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
michael Rхорошо забей на правильный порядок
не могу, -
накатило
Код: plaintext
1.
2.
3.
4.
5.
?STWRE2("","")
~info;;ws~
~com~
~com;;net;;org~
~net;;org;;ws;;su~
~su~
Код: plaintext
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
Function STWRE2( _
                ByVal s0$, _
                ByVal sText$, _
                Optional ByVal sValSep = ",", _
                Optional ByVal sTXTSep$)

''Const SWS$ = "\s"
Const SWS$ = "(?:\s|\s)"

Dim clt As Collection, re, mt
Dim i%, ii%
Dim pos0%, pos%
Dim sFind

' ### for test ONLY -->
    s0$ = "com,net,org,info,su,ws": sValSep = ","
    
    sText = _
    "ws;;" + vbNewLine + _
    "info;;ws" + vbNewLine + _
    "com" + vbNewLine + _
    "com;;org;;info;;btr" + vbNewLine + _
    "com;;net;;org" + vbNewLine + _
    "com;;org;;info;;com" + vbNewLine + _
    "net;;org;;ws;;su" + vbNewLine + _
    "su"
    sTXTSep = ";;"
' ### for test ONLY <--

sText = " " + sText + " "
If sTXTSep = "" Then sTXTSep = sValSep

re = Split(s0, sValSep)
Set clt = New Collection

' сборка паттерна, заполнение коллекции
For i = UBound(re) To  1  Step - 1 
    clt.Add CInt(i), re(i)
    sFind = "|" & re(i) & sFind
Next
clt.Add CInt(i), re(i)
ii = UBound(re) -  1 

sFind = "(" + re(i) + sFind + ")" + _
"(" + sTXTSep + "(" + Mid$(sFind,  2 ) + ")){0,1}" + _
"(" + sTXTSep + "(" + Mid$(sFind,  2 ) + ")){0," + CStr(ii) + "}"

''sFind = SWS + sFind + SWS
sFind = SWS + "(" + sFind + ")" + SWS

Erase re

' проверка на
Set re = CreateObject("VBScript.RegExp")
re.Global = - 1 : re.MultiLine = - 1 : re.IgnoreCase = - 1 : re.Pattern = sFind
Set mt = re.Execute(sText)
If mt.Count >  0  Then
    For i =  0  To mt.Count -  1 
        pos0 =  1 
        
        ''If mt(i).SubMatches.Count > 1 Then
        If mt(i).SubMatches.Count >  2  Then
            
            ''If mt(i).SubMatches(1) > "" Then
            If mt(i).SubMatches( 2 ) > "" Then
            
            ''pos0 = clt(mt(i).SubMatches(0))
            pos0 = clt(mt(i).SubMatches( 1 ))
            
            ''For ii = 2 To mt(i).SubMatches.Count - 1 Step 2
            For ii =  3  To mt(i).SubMatches.Count -  1  Step  2 
            
                If mt(i).SubMatches(ii) > "" Then
                    pos = clt(mt(i).SubMatches(ii))
                    If pos <= pos0 Then
                            pos0 =  0 : Exit For 'ii, SubMathes
                    Else:   pos0 = pos
                    End If
                End If
            Next ii 'SubMatches.Count
            End If
        End If
        
        ''If pos0 > 0 Then Debug.Print "~" + Trim(Replace(Replace(mt(i), vbCr, ""), vbLf, "")) + "~"
        If pos0 >  0  Then Debug.Print "~" + mt(i).SubMatches( 0 ) + "~"
        
    Next i
Else
    Debug.Print "WRONG TEXT"
End If
Set clt = Nothing: Set mt = Nothing: Set re = Nothing
End Function
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37235213
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотища
спасибо
странно но почему то работает


насколько я понял
достаточно один раз с генерировать шаблон для всех вариантов
и потом проверять на текст у которого вначале и в конце стоит по одному пробелу
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37235272
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотища
а можно ещё понаглеть ?
коли ты такой добрый

в данном шаблоне первое слово (com) всегда на первом месте (если имеется в проверочном тексте)
это хорошо и правильно
а вот остальные слова в наборе имеют плавающую позицию

можно ли и им установить чёткие позиции ?

если нельзя ну что уж поделаешь

Спасибо
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37235375
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
michael Rстранно но почему то работает
Не работает: в тестовом примере строка
Код: plaintext
1.
~net;;org;;ws;;su~ ' в шаблоне ws ПОСЛЕ su
Не обрабатывется позиция предпоследнего "слова" если вхождений более трёх :(
.SubMatches ... будь счастлив тот, кто их запихнул в vbscript.regexr и при этом обрезал Lookahead- и Lookbehind-
Сейчас правлю


michael R... можно ли и им установить чёткие позиции ?Можно. На "первый взгляд" даже проще чем с плавающими.
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37236131
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
michael R,
исправление 10571843 , - пришлось добавить одно РВ. Иначе (возможно пока) - никак :(
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
?STWRE3("","")
~info~ 0 
~info;;ws~ 1 
    inexact accordance:     ~jp;;su~ 2 
~com~ 3 
    inexact accordance:     ~org;;ws;;net~ 4 
~org;;ws;;info~ 5 
~com;;net;;org~ 6 
    inexact accordance:     ~net;;org;;su;;net~ 7 
~net;;org;;su;;de;;gov;;jp~ 8 
~net;;org;;ws;;su;;de;;gov;;jp~ 9 
~su~ 10 
Код: plaintext
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
Function STWRE3(ByVal s0$, ByVal sText$, Optional ByVal sValSep = ",", Optional ByVal sTXTSep$)

Const iMMATCH% =  3           ' ==.SubMatches.Count-1 "чернового" RE
                            ' зависит ТОЛЬКО от паттерна (не считая машины RE)

Const SWS$ = "(?:\s|\s)"    ' аффикс паттерна "чернового" RE

Dim clt As Collection, re, mt, mt2
Dim i%, ii%, pos0%, pos%, pos1%, j%
Dim sFind$, sFind2$

' ### for test ONLY -->
    s0$ = "com,net,org,info,su,ws,de,gov,jp": sValSep = ","
    sText = _
    "info" + vbNewLine + _
    "ws;;" + vbNewLine + _
    ";;de" + vbNewLine + _
    "info;;ws" + vbNewLine + _
    "jp;;su" + vbNewLine + _
    "com" + vbNewLine + _
    "org;;ws;;net" + vbNewLine + _
    "org;;ws;;info" + vbNewLine + _
    "com;;net;;org" + vbNewLine + _
    "com;;org;;info;;btr" + vbNewLine + _
    "net;;org;;su;;net" + vbNewLine + _
    "net;;org;;su;;de;;gov;;jp" + vbNewLine + _
    "net;;info;;zzz;;su;;de;;jp" + vbNewLine + _
    "net;;org;;ws;;su;;de;;gov;;jp" + vbNewLine + _
    "su"
    sTXTSep = ";;"
' ### for test ONLY <--

sText = " " + sText + " "
If sTXTSep = "" Then sTXTSep = sValSep


re = Split(s0, sValSep)
Set clt = New Collection

' сборка паттерна "чернового" RE, заполнение коллекции "словами"
For i = UBound(re) To  1  Step - 1 
    clt.Add CInt(i), re(i)
    sFind = "|" + re(i) + sFind
Next
clt.Add CInt(i), re(i)
ii = UBound(re) -  1 

sValSep = "(?:" + sTXTSep + "|" + sTXTSep + ")"

sFind = "(" + re(i) + sFind + ")" + _
        "(" + sValSep + "(" + Mid$(sFind,  2 ) + "))*"

sFind = SWS + "(" + sFind + ")" + SWS                           ' паттерн1 ("черновой")
sFind2 = "((?!" + sTXTSep + "|" + sTXTSep + "))+" + sTXTSep     ' паттерн2 ("чистовой")

Erase re

' проверка на
Set re = CreateObject("VBScript.RegExp")
re.Global = - 1 : re.MultiLine = - 1 : re.IgnoreCase = - 1 : re.Pattern = sFind

Set mt = re.Execute(sText)
If mt.Count >  0  Then
    
    re.Pattern = sFind2

    ' обработка наборов "слов", прошедших "черновую" проверку
    For i =  0  To mt.Count -  1 
        pos0 =  0                            ' флаг полного соответствия "шаблону"
    
    If mt(i).SubMatches(iMMATCH) > "" Then ' в набор более одного слова
                                            ' (!) условие зависит от паттерна "чернового" RE
    
        pos0 = clt(mt(i).SubMatches( 1 ))
        pos1 = clt(mt(i).SubMatches(iMMATCH))
        
        ' проверка порядка следования "слов"
        If pos1 <= pos0 Then
            ' неверный порядок (по первому-последнему элементам)
            pos0 = - 1 
        ElseIf pos1 - pos0 >  1  Then
            
            Set mt2 = re.Execute(mt(i).SubMatches( 0 ) + sTXTSep)
            j = mt2.Count -  2 : ii =  1 
            
            Do While ii <= j
                
                pos = clt(mt2.matches(ii))
                If pos <= pos0 Or pos >= pos1 Then
                    pos0 = - 1 : Exit Do
                
                ElseIf ii < j Then
                
                    pos0 = pos: pos = clt(mt2.matches(j))
                    If pos <= pos0 Or pos >= pos1 Then
                        pos0 = - 1 : Exit Do
                    Else
                        pos1 = pos
                    End If
                End If
                
                ii = ii +  1 : j = j -  1 
            Loop ' While ii <= j
            
        End If ' pos1 < pos0
    End If ' mt(i).SubMatches(iMMATCH) > ""
    
    sFind = "~" + mt(i).SubMatches( 0 ) + "~" + CStr(i)
    'If pos0 >= 0 Then Debug.Print sFind Else Debug.Print vbTab; "inexact accordance: ", sFind
    If pos0 <  0  Then Debug.Print vbTab; "inexact accordance: ",
    Debug.Print sFind
    
    Next i ' mt.Count
Else
    Debug.Print "WRONG TEXT"
End If

Set clt = Nothing: Set mt = Nothing: Set mt2 = Nothing: Set re = Nothing
End Function
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37236210
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нее не работает

порядок не проверяется
да и можно повторные имена вставлять
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37236257
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
michael R...а вот остальные слова в наборе имеют плавающую позицию
можно ли и им установить чёткие позиции ?Если всем "словам" в шаблоне задать чёткие позиции, - получим в качестве шаблона _константу_, - регулярные выражения становятся не нужны.

Если чёткие позиции определять только для части "слов", то надо уточнить
- как поступать в том случае, если длина тестируемого набора, частично совпадающего с шаблоном, будет меньше,
чем позиция крайнего правого "(за)фиксированного" слова;
- как искать в наборах с "фиксированными" словами .... проще на примерах:
набор "правильных" слов: "s1, f1 , s2, s3, s4, f2 , f3 , s5, s6, s7, s8", где fN - "фиксированные", sK - "плавающие" слова
? следует ли "фиксацию" понимать как абсолютные координаты (f1 нету на второй позиции - набор тест не прошел),
или как относительные (относительно чего, блин...)
? "плавающие" слова искать только в границах "фиксаторов" или по всему набору (s4 только в границах позиций f1,f2 или ...)
? etc
Пардон за "многабукаф"...

Без иронии:
99% процентов проблем решаются одним простым вопросом: нафига?(с)
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37236264
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
michael Rнее не работает

порядок не проверяется
да и можно повторные имена вставлятьТестовый пример, а то у меня глаз уже замылился.
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37236280
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотища

с константой я и так понял уже
только там несколько тысяч вариаций

не заморачивайся так тоже нормально
спасибо
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37236313
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
michael R,
я же говорил, - накатило. Пока не заработает - спать не смогу :)
А тестовый пример - это две же всего две строки:
1)список "правильных" слов в правильном порядке
2)строка проверяемого текста об которую спотыкается функция.
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37236334
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот все слова
com;;net;;org;;info;;biz;;us;;mobi;;tv;;ws;;me;;name;;cc;;tel;;other


каждое появляется не больше одного раза
и хотелось бы что порядок появления в проверяемом тексте был таким же
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37236369
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
michael R,
добрый :)
А строка проверяемого текста об которую функия спотыкается где-то в буфере обмена застряла ?
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37236393
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
michael Rс константой я и так понял уже
только там несколько тысяч вариацийТогда это не константа.
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37236412
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот все слова
com;;net;;org;;info;;biz;;us;;mobi;;tv;;ws;;me;;name;;cc;;tel;;other


вариантов уйма

примеры проверяемого текста - правильный текст
com;;net;;org
com;;net;;org;;tel
com;;org
net;;org
other
................

примеры проверяемого текста - неправильный текст
com;;com;net;;org
com;;net;;org;;net
net;com;;org
net;;org;;
;;other;;
.......................

константа я имел ввиду что бы перечислить возможные варианты через |
ну и ещё если пусто ничего не выбранно
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37236803
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
michael R,
и снова здравствуйте!
функционально ничего нового
Код: plaintext
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
' **********************************************
Function STWRE4(ByVal s0$, ByVal sText$, _
                Optional ByVal sValSep = ",", Optional ByVal sTXTSep$)

On Error GoTo Err_Exit_F

Const iMMATCH% =  3           ' ==.SubMatches.Count-1 "чернового" RE
                            ' зависит ТОЛЬКО
                            ' от паттерна (не считая машины RE)

Const SWS$ = "(?:\s)"       ' аффикс паттерна "чернового" RE

Dim clt, re, mt, mt2
Dim i%, ii%
Dim pos0%, pos%, pos1%, j%
Dim sFind$, sFind2$


sText = " " + sText + " "
If sTXTSep = "" Then sTXTSep = sValSep

re = Split(s0, sValSep)
Set clt = New Collection

' сборка паттерна "чернового" RE, заполнение коллекции "словами"
For i = UBound(re) To  1  Step - 1 
    clt.Add CInt(i), re(i)
    sFind = "|" + re(i) + sFind
Next
clt.Add CInt(i), re(i)


sValSep = "(?:" + sTXTSep + "|" + sTXTSep + ")"

sFind = "(" + re(i) + sFind + ")" + _
        "(" + sValSep + "(" + Mid$(sFind,  2 ) + "))*"

sFind = SWS + "(" + sFind + ")" + SWS                       ' паттерн "черновой"
sFind2 = "(?:" + sTXTSep + ")(.+?)(?=" + sTXTSep + ")"      ' паттерн2 "чистовой"


Erase re

' поиск соответствия "черновому" паттерну по всему тексту
Set re = CreateObject("VBScript.RegExp")
re.Global = - 1 : re.MultiLine = - 1 : re.IgnoreCase = - 1 
re.Pattern = sFind                          ' поиск по "черновому" паттерну

Set mt = re.Execute(sText)
If mt.Count >  0  Then
    
    re.Pattern = sFind2                     ' переключение RE на "чистовой" паттерн

    ' обработка наборов "слов", прошедших "черновую" проверку
    For i =  0  To mt.Count -  1 
        pos0 =  0                            ' флаг полного соответствия "шаблону"
    
    If mt(i).SubMatches(iMMATCH) > "" Then
    ' в набор более одного слова (!) условие зависит от паттерна "чернового" RE
    
        pos0 = clt(mt(i).SubMatches( 1 ))             ' первое слово в "черновом" наборе
        pos1 = clt(mt(i).SubMatches(iMMATCH))       ' последнее слово в "черновом" наборе
        
        ' проверка порядка следования "слов"
        If pos1 <= pos0 Then
            ' неверный порядок (по первому-последнему элементам)
            pos0 = - 1 
            
        ElseIf pos1 - pos0 =  1  Then
            ' набор должен состоять из двух элементов
            If mt(i).SubMatches( 1 ) + sTXTSep + _
                 mt(i).SubMatches(iMMATCH) <> mt(i).SubMatches( 0 ) Then _
            pos0 = - 1 
        
        Else
            
            sText = sTXTSep + mt(i).SubMatches( 0 ) + sTXTSep
            Set mt2 = re.Execute(sFind)
            j = mt2.Count -  2 : ii =  1 
            
            Do While ii <= j
                
                pos = clt(mt2(ii).SubMatches( 0 ))
                If pos <= pos0 Or pos >= pos1 Then
                    pos0 = - 1 : Exit Do
                
                ElseIf ii < j Then
                    pos0 = pos: pos = clt(mt2(j).SubMatches( 0 ))
                    If pos <= pos0 Or pos >= pos1 Then
                        pos0 = - 1 : Exit Do
                    Else
                        pos1 = pos
                    End If
                End If
                
                ii = ii +  1 : j = j -  1 
            Loop ' While ii <= j

        End If ' pos1 <= pos0
    End If ' mt(i).SubMatches(iMMATCH) > ""
    
    sFind = "~" + mt(i).SubMatches( 0 ) + "~" + CStr(i)
    If pos0 <  0  Then Debug.Print vbTab; "inexact accordance: ",
    Debug.Print sFind
    
    Next i ' mt.Count
Else
    Debug.Print "WRONG TEXT"
End If

Norm_Exit_F:
Set clt = Nothing: Set mt = Nothing: Set mt2 = Nothing: Set re = Nothing
Exit Function

Err_Exit_F:
    Select Case Err.Number
    Case  457 : sFind = "повтор слова в словаре: ~" + re(i) + "~"
    Case Else
        sFind = "RT error: '" + Err.Number + "'" + vbNewLine + Err.Description
    End Select
    Debug.Print "(!) ", sFind
    Resume Norm_Exit_F
End Function
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37236952
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
s0$ = "com;;net;;org;;info;;ws;;biz;;tel;;other"
sText$ = "com;;org;;net"
sValSep = ";;"

s0$ = "com;;net;;org;;info;;ws;;biz;;tel;;other"
sText$ = "com;;net;;net"
sValSep = ";;"


эти варианты ошибочны
но они отрабатывают как рабочие

думаю таких неправильных вариантов не мало

...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37237040
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
@test = (
	"com;;net;;org",
	"com;;org;;net",
	"com;;net;;net",
	";;",
	"net;;",
	"abc;;ws",
	";;net",
	"com,org"
);

@words = ("com", "net", "org", "info", "ws", "biz", "tel", "other");
$separator = ";;";
$pattern = '^(' .  join (")?((?<=.)(?<!$separator)$separator(?=.)(?!^$separator))?(", @words) . ')?$';

 foreach  $t (@test) {
	 if ($t !~ $pattern) {
		 print  "$t\n";
	}
}
Все прекрасно работает...
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37237043
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
michael Rдумаю таких неправильных вариантов не мало
Код: plaintext
1.
2.
3.
4.
5.
6.
?STWRE4("com;;net;;org;;info;;ws;;biz;;tel;;other", "com;;org;;net", ";;")
    inexact accordance:     ~com;;org;;net~ 0 


?STWRE4("com;;net;;org;;info;;ws;;biz;;tel;;other", "com;;net;;net", ";;")
    inexact accordance:     ~com;;net;;net~ 0 
Уффф ...
inexact accordance == неполное соответствие

при соответствии выводит набор слов с индексом в массиве "полусовпавших"
Код: plaintext
1.
?STWRE4("com;;net;;org;;info;;ws;;biz;;tel;;other", "com;;net;;other", ";;")
~com;;net;;other~ 0 
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37237057
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlВсе прекрасно работает... чем такую красотЫщу к VB прикрутить?
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37237080
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотищаWhite OwlВсе прекрасно работает... чем такую красотЫщу к VB прикрутить?я уже говорил, что VB убог? :) Ну нету в Микрософтовской библиотеке регулярных выражений look-around шаблонов. Ну нееееетуууу.... Не доросли еще мелкомягкие до такого.

A на VB тоже самое можно решить намноооооого проще без регулярок вообще:
Код: plaintext
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.
33.
34.
35.
36.
dim test( 8 )
test( 0 ) = 	"org;;other"
test( 1 ) = 	"com;;net;;org"
test( 2 ) =	"com;;org;;net"
test( 3 ) =	"com;;net;;net"
test( 4 ) =	";;"
test( 5 ) =	"net;;"
test( 6 ) =	"abc;;ws"
test( 7 ) =	";;net"
test( 8 ) =	"com,org"

for i=lbound(test) to ubound(test)
	if checkAndFail(test(i)) then wscript.echo test(i)
next


function checkAndFail(txt)
	dim i
	separator = ";;"
	etalon = "com;;net;;org;;info;;ws;;biz;;tel;;other"
	checkAndFail=false
	arr = split(txt, separator)

	if ubound(arr)= 0  or len(arr(lbound(arr)))= 0  or len(arr(ubound(arr)))= 0  then
		checkAndFail=true
		exit function
	end if

	pos =  0 
	for i=lbound(arr) to ubound(arr)
		pos = instr(pos+ 1 , etalon, arr(i))
		if pos= 0  then
			checkAndFail=true
			exit for
		end if
	next
end function

Уж сколько раз твердили миру: Some people, when confronted with a problem, think “I know, I'll use regular expressions.” Now they have two problems.
Ну нельзя их пихать во все дырки, нельзя... Бессмысленно это.
Одно дело если человек пишет на Перле, там регулярные выражения самые развитые. Но пытаться заткнуть ими нелюбовь к InStr...
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37237083
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или чуть более универсально:
Код: plaintext
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
dim test( 8 )
test( 0 ) = 	"org;;other"
test( 1 ) = 	"com;;;;net;;org"
test( 2 ) =	"com;;org;;net"
test( 3 ) =	"com;;net;;net"
test( 4 ) =	";;"
test( 5 ) =	"net;;"
test( 6 ) =	"abc;;ws"
test( 7 ) =	";;net"
test( 8 ) =	"com,org"

for i=lbound(test) to ubound(test)
	if checkAndFail(test(i)) then wscript.echo test(i)
next


function checkAndFail(txt)
	dim i
	separator = ";;"
    etalon = "com;;net;;org;;info;;ws;;biz;;tel;;other"
	checkAndFail=false
	arr = split(txt, separator)

	if ubound(arr)= 0  then
		checkAndFail=true
		exit function
	end if

	pos =  0 
	for i=lbound(arr) to ubound(arr)
		if len(arr(i))= 0  then
			checkAndFail=true
			exit for
		end if

		pos = instr(pos+ 1 , etalon, arr(i))
		if pos= 0  then
			checkAndFail=true
			exit for
		end if
	next
end function
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37237089
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl

в случаи одиночных слов не работает без разделителя

...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37237091
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owlя уже говорил...
Говорил . Знаю, чего где нет. Спрашивал "чем прикрутить?".
Решение красивое с InString. Одно условие лишнее: Ubound(arr)=0.
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37238932
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотищаСпрашивал "чем прикрутить?".В принципе, perl очень легко встраивается в любое приложение. Так что вполне можно взять свой любимый VB, прикрутить к нему perl (ActivePerl наверное) как скриптовый расширитель и горя не знать.
Инструкция по прикурчиванию, как ни странно, лежит в официальной документации: http://perldoc.perl.org/perlembed.html
Там для C конечно же, но ничего особо сложного для перевода этого на VB я не вижу.

скукотищаОдно условие лишнее: Ubound(arr)=0.Это уже мелочи которые легко исправить.
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37238967
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
michael RWhite Owl

в случаи одиночных слов не работает без разделителя

Убери проверку на ubound(arr)=0 и все заработает. И вообще, там всего скрипта то меньше тридцати строк, неужели так сложно понять как оно работает и выловить баги?
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37241619
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а чтобы Option Explicit не ругался, пишем так:
Dim reg As Object
????
Каюсь, давали ссылку раньше по возможностям регулярки, где прописаны все специальные знаки объекта, потерял
Можно ещё раз выложить. Спасибо
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37241621
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет у меня есть ссылка http://artefact.lib.ru/design/text_khozyainov.shtml но помому это чуть не то, что надо
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37241723
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl Убери проверку на ubound(arr)=0 и все заработает. И вообще, там всего скрипта то меньше тридцати строк, неужели так сложно понять как оно работает и выловить баги?

ну вообщем понятно
спасибо
хотелось конечно именно регуляркой
но ладно так тоже пойдёт с пивом
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37241771
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ципихович ЭндрюКаюсь, давали ссылку раньше по возможностям регулярки, где прописаны все специальные знаки объекта, потерял
Можно ещё раз выложить. Спасибо VBScript.RegExp
...
Рейтинг: 0 / 0
regexp уменьшить количество вариаций при проверке
    #37241790
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ципихович Эндрюа чтобы Option Explicit не ругался, пишем так:
Dim reg As Object
????


Спасибо за ссылку
...
Рейтинг: 0 / 0
51 сообщений из 51, показаны все 3 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / regexp уменьшить количество вариаций при проверке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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