Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / regexp уменьшить количество вариаций при проверке / 25 сообщений из 51, страница 1 из 3
26.04.2011, 15:38
    #37234017
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
regexp уменьшить количество вариаций при проверке
имею некий набор слов
(a1, a2, a3, a4....) значений много

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

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

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

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

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

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

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

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

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

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

использую такой вариант
(a1)?((?<=[^,]),)(a2)?((?<=[^,]),)(a3)?
но работает только
a1,a2,a3 это правильно
a1,a2, - а это не правильно
...
Рейтинг: 0 / 0
26.04.2011, 19:21
    #37234579
сккотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
regexp уменьшить количество вариаций при проверке
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
26.04.2011, 20:43
    #37234667
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
regexp уменьшить количество вариаций при проверке
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
26.04.2011, 20:56
    #37234681
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
regexp уменьшить количество вариаций при проверке
White OwlНуууу.. забыл look-behind после запятой добавить:

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

но мне кажется что такое сделать невозможно
а писать все варианты просто убиться
...
Рейтинг: 0 / 0
27.04.2011, 08:51
    #37235099
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
regexp уменьшить количество вариаций при проверке
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
27.04.2011, 10:02
    #37235213
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
regexp уменьшить количество вариаций при проверке
скукотища
спасибо
странно но почему то работает


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

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

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

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

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


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


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