|
Вопрос по регулярным выражениям | ☑ | ||
---|---|---|---|---|
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
|
||||
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]+) - возвращает только первые два значения. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |