powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / regexp уменьшить количество вариаций при проверке
25 сообщений из 51, страница 1 из 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
25 сообщений из 51, страница 1 из 3
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / regexp уменьшить количество вариаций при проверке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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