Имя: Пароль:
1C
1С v8
Вопрос по регулярным выражениям
,
0 pmb
 
11.04.13
12:31
Подскажите как с помощью VBScript.RegExp можно разобрать строку вида

[произвольная подстрока] [Значение1]/[Значение2] ... /[Значение n]

где [Значение i] - подстрока, состоящая из цифр и символов латинского алфавита

Сейчас такую строку разбираю в два этапа - сначала [Значение1], стоящее до первого /, потом все остальные значения.

Можно ли сделать это с помощью одного регулярного выражения.
1 kosts
 
11.04.13
12:38
Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
   
   МассивСтрок = Новый Массив();
   Если Разделитель = " " Тогда
       Стр = СокрЛП(Стр);
       Пока 1=1 Цикл
           Поз = Найти(Стр,Разделитель);
           Если Поз=0 Тогда
               МассивСтрок.Добавить(Стр);
               Возврат МассивСтрок;
           КонецЕсли;
           МассивСтрок.Добавить(Лев(Стр,Поз-1));
           Стр = СокрЛ(Сред(Стр,Поз));
       КонецЦикла;
   Иначе
       ДлинаРазделителя = СтрДлина(Разделитель);
       Пока 1=1 Цикл
           Поз = Найти(Стр,Разделитель);
           Если Поз=0 Тогда
               МассивСтрок.Добавить(Стр);
               Возврат МассивСтрок;
           КонецЕсли;
           МассивСтрок.Добавить(Лев(Стр,Поз-1));
           Стр = Сред(Стр,Поз+ДлинаРазделителя);
       КонецЦикла;
   КонецЕсли;
   
КонецФункции
2 Fragster
 
гуру
11.04.13
12:39
[a-z0-9](/|^)
3 Fragster
 
гуру
11.04.13
12:39
([a-z0-9]+)(/|^)
4 pmb
 
11.04.13
13:47
(3) наверное вот так ([a-z0-9]+)(/|$).
Но все равно не подходит, нужно именно значения, стоящие до /
или после него.
Например:
LH 4060A241/4060A377/339118 RH

Нужно получить:
4060A241
4060A377
339118
5 orefkov
 
11.04.13
13:54
Может
[a-z0-9]+(?=/|$)
6 pmb
 
11.04.13
13:59
Вот это возвращает то что надо, но только первые два значения. ([a-z0-9]+)(/)|(\1)([a-z0-9]+)
(5) сейчас попробую.
7 Fragster
 
гуру
11.04.13
13:59
(5) а поддерживает ли vb просмотр назад? ЕМНИП нет
8 Fragster
 
гуру
11.04.13
14:00
в (4) смотри submatches
9 pmb
 
11.04.13
14:02
(6) не подходит, он по концу строки проверяет.
10 orefkov
 
11.04.13
14:04
Вот это работает, только надо у некоторых совпадений убирать первый слэш.
[a-z0-9]+(?=/)|/[a-z0-9]+

В vb нет просмотра назад. А если брать ВК из v8: Регулярные выражения в v82, там есть look behind, там можно так сделать:
(?i)[a-z0-9]+(?=/)|(?<=/)[a-z0-9]+
11 pmb
 
11.04.13
14:04
(8) здесь проверяю regexp.ru на строке
"пер LH 4060a241/4060a377/339118 RH"
339118 не возвращает.
12 pmb
 
11.04.13
14:08
(10) спасибо.
13 badboychik
 
11.04.13
14:11
([A-z0-9]{4,}(?=/?))+
14 orefkov
 
11.04.13
14:20
(13)
Это вообще http://snegopat.ru/files/img/regex.png

Совершенно ничего не находит.
15 orefkov
 
11.04.13
14:25
(12)
А если надо не только латинские буквы, то правильнее будет в той ВК:
(?i)[\p{Letter}\d]+(?=/)|(?<=/)[\p{Letter}\d]+
16 Fragster
 
гуру
11.04.13
14:28
(\w+(?=/))|(/(\w+))
17 Fragster
 
гуру
11.04.13
14:31
соответственно, либо первый submatch, либо третий

"4060a241"
   "4060a241"
   ""
   ""
"/4060a377"
   ""
   "/4060a377"
   "4060a377"
"/339118"
   ""
   "/339118"
   "339118"
18 orefkov
 
11.04.13
14:45
(13) (14)
Извиняюсь, виноват.
При копировании в конец затесалось несколько пробелов.
Удалил их - все нашло.
19 orefkov
 
11.04.13
14:47
+(18)
Но неправильно работает, тупо отсекает слова короче 4 символов. На тестовом примере просто совпало.
20 badboychik
 
11.04.13
14:56
(19) давай больше тестовых примеров )
21 badboychik
 
11.04.13
14:58
(19) а между слэшами могут быть последовательности короче 4 символов?
22 pmb
 
11.04.13
15:16
(21) могут ;)
23 pmb
 
11.04.13
15:20
вот например.
Втулка 54613-7S005/54613-ZQ00A/ZV50A пер.
Втулка 16 D1060-AX61A/D1060-AX61F/987/981/55810-62j50/D1060-BH40A/410608481R пер.
24 Fragster
 
гуру
11.04.13
15:23
(23) замени \w на набор символов, если не находит...
25 Fragster
 
гуру
11.04.13
15:25
например так: ([-a-z0-9]+(?=/))|(/([-a-z0-9]+))
26 pmb
 
11.04.13
15:25
(24) у меня проблема была не с набором, а с ретроспективной проверкой. Вварант в (10) работает нормально.
27 pmb
 
11.04.13
15:28
правда пока не понял, почему
([a-z0-9]+)(/)|(\1)([a-z0-9]+)  - возвращает только первые два значения.