![]() |
![]() |
![]() |
|
Поиск числовых символов в строке... | ☑ | ||
---|---|---|---|---|
0
Z_Z
02.03.09
✎
11:42
|
Привет всем!!!!Нужна помощь коллективного разума:))
Есть строки вида "вапвпв 4546 вывапа"" "прпар 79879 вапвап" "ывавава444авывап" и т.д. мне надо поизвлекать числа из этих строк по маске не поиск чисел не получается:(( Есть еще какие-то варианты поиска. |
|||
1
Ёпрст
гуру
02.03.09
✎
11:45
|
посимвольно, используя Сред + Найти...
|
|||
2
AcaGost
02.03.09
✎
11:46
|
Если Найти("1,2,3,4,5,6,7,8,9,0",Твой символ) >0 Тогда
|
|||
3
Z_Z
02.03.09
✎
11:50
|
Посимвольно отпадает сразу...
Ибо строки длиные и массивы строк огромные..:(( |
|||
4
AcaGost
02.03.09
✎
11:51
|
(3) Тогда сотня негритят. Таджиков не бери.
|
|||
5
1Сергей
02.03.09
✎
11:56
|
не понял, что нужно получить в результате?
|
|||
6
Z_Z
02.03.09
✎
11:59
|
ИЗ СТРОКИ нужно получить цифры, входящие в эту строку
|
|||
7
Сергей-ХХХ
02.03.09
✎
12:00
|
(0) Если строк много (очень) и хочется быстрее, тогда имеет смысл накатать прогу, которая законвертит все в некий формат с разделителями. Получившийся файл можно будет читать и всячески юзать...
|
|||
8
Дуб
02.03.09
✎
12:01
|
(3) один фиг - посимвольно. Просто можешь использовать не-одноэсные средства для парсинга.
|
|||
9
Z_Z
02.03.09
✎
12:02
|
Да подумываю какую-то компонетку написать
тут на с++ или vb 2 мин работы |
|||
10
smaharbA
02.03.09
✎
12:04
|
(9) забей - фуфло выйдет полюбому...
|
|||
11
PRADA
02.03.09
✎
12:05
|
Процедура Сформировать()
икс = 1; ПолученаяСтрока = ""; Пока икс < СтрДлина(ИсходнаяСтрока) Цикл Если (Сред(ИсходнаяСтрока,икс,1) <> "1") И (Сред(ИсходнаяСтрока,икс,1) <> "2") И (Сред(ИсходнаяСтрока,икс,1) <> "3") И (Сред(ИсходнаяСтрока,икс,1) <> "4") И (Сред(ИсходнаяСтрока,икс,1) <> "5") И (Сред(ИсходнаяСтрока,икс,1) <> "6") И (Сред(ИсходнаяСтрока,икс,1) <> "7") И (Сред(ИсходнаяСтрока,икс,1) <> "8") И (Сред(ИсходнаяСтрока,икс,1) <> "9") И (Сред(ИсходнаяСтрока,икс,1) <> "0") Тогда ПолученаяСтрока = ПолученаяСтрока + Сред(ИсходнаяСтрока,икс,1); КонецЕсли; икс = икс + 1; КонецЦикла; Сообщить("исходная : " + ИсходнаяСтрока + "получили : " + ПолученаяСтрока); КонецПроцедуры |
|||
12
Fragster
гуру
02.03.09
✎
12:05
|
||||
13
smaharbA
02.03.09
✎
12:05
|
(11) это чо ?
|
|||
14
rs_trade
02.03.09
✎
12:05
|
Функция глВыделитьЧисло(Значение, Знаков=0, Реж=0) Экспорт
// Выделяет число из строкового или числового значения // в количестве указанных знаков слева (Реж=0) или справа (Реж=1) // 0 Знаков = не обрезать; // Зн=Строка(Значение); Стр=""; Для Сч=1 по СтрДлина(Зн) Цикл С=Сред(Зн, Сч, 1); Если Найти("0123456789",С)>0 Тогда Стр=Стр+С КонецЕсли; КонецЦикла; Если Знаков>0 Тогда Стр=?(Реж=0,Лев(Стр,Знаков),Прав(Стр,Знаков)); КонецЕсли; Возврат Число(Стр); КонецФункции // глВыделитьЧисло |
|||
15
Fragster
гуру
02.03.09
✎
12:07
|
//Для 1С 7.7:
Истина=-1; Ложь=0; RegExp = CreateObject("VBScript.RegExp"); RegExp.IgnoreCase = Ложь; //Игнорировать регистр RegExp.Global = Истина; //Поиск всех вхождений шаблона RegExp.MultiLine = Ложь; //Многострочный режим RegExp.Pattern = "\d+"; //Ищем числа Matches=RegExp.Execute(СтрокаПоиска); ЧислоВхождений=Matches.Count(); Если ЧислоВхождений>0 Тогда Для к = 0 По ЧислоВхождений-1 Цикл Match = Matches.Item(к); Сообщить("Найдено число:"+ Match.Value); КонецЦикла; Иначе Сообщить("Вхождений шаблона не найдено"); КонецЕсли; |
|||
16
Дядя Васька
02.03.09
✎
12:07
|
(0) Примеры строк накидай. Посимвольно-то полюбому. Но может тебе и не надо все цифры искать, а просто идти по строке пока не цифра, затем пока цифра. Оно и недолго будет.
|
|||
17
1Сергей
02.03.09
✎
12:08
|
Функция ВзятьЦифры(Стр)
Рез=""; Для идн=1 По СтрДлина(Стр) Цикл Сим=Сред(Стр,Идн,1); Если (Сим>="0")И(Сим<="9") Тогда Рез=Рез+Сим; КонецЕсли; КонецЦикла; Возврат Рез; КонецФункции // ВзятьЦифры |
|||
18
Z_Z
02.03.09
✎
12:10
|
Сейчас все проверю... и результаты напишу....
Спасибо большое!!!Думаю, что-то по-любому подойдет. |
|||
19
Fragster
гуру
02.03.09
✎
12:11
|
(14,17) а подумать? если в строке больше одного числа?
|
|||
20
1Сергей
02.03.09
✎
12:12
|
(19) он же не говорит в каком виде ему надо. Я так понял, просто набор цифирей
|
|||
21
Mikeware
02.03.09
✎
12:12
|
регулярне выражения уже предлагали?
|
|||
22
Z_Z
02.03.09
✎
12:13
|
в каком видде встречается в таком и надо
" fsd fsd 455fsdf" на выходе должно получится 455 |
|||
23
mrkorn
02.03.09
✎
12:13
|
||||
24
1Сергей
02.03.09
✎
12:14
|
(22) " fsd 10 fsd 455fsdf"
1. 10455 2. 10,455 3. 1,0,4,5,5 |
|||
25
Z_Z
02.03.09
✎
12:17
|
вариант 2
|
|||
26
rs_trade
02.03.09
✎
12:17
|
(19) Сам то подумал че написал? Что тебе там не нравится?
|
|||
27
Fragster
гуру
02.03.09
✎
12:21
|
(26) ну и как твоя мега функция выделит в варианте (24) оба числа? куда оно номер символа, на котором остановилось возвращает?
(25) тогда тебе (12,15) (насчет паттерна не уверен, что вб поддерживает такую нотацию, но "[0-9]+" - подойдет наверняка) |
|||
28
rs_trade
02.03.09
✎
12:24
|
(27) Нее. Она не для этого, если как в (24) пункт 2...
|
|||
29
1Сергей
02.03.09
✎
12:31
|
Функция ВзятьЦифры(Стр)
Рез=СоздатьОбъект("СписокЗначений"); флЧисло=-1; ТекЧисло=0; Для идн=1 По СтрДлина(Стр) Цикл Сим=Сред(Стр,Идн,1); Если (Сим>="0")И(Сим<="9") Тогда ТекЧисло=ТекЧисло+Сим; флЧисло=1; Иначе Если флЧисло=1 Тогда Рез.ДобавитьЗначение(Число(ТекЧисло)); КонецЕсли; флЧисло=0; КонецЕсли; КонецЦикла; Если флЧисло=1 Тогда Рез.ДобавитьЗначение(Число(ТекЧисло)); КонецЕсли; Возврат Рез; КонецФункции // ВзятьЦифры |
|||
30
Fragster
гуру
02.03.09
✎
12:32
|
(29) а теперь сравни производительность
|
|||
31
1Сергей
02.03.09
✎
12:32
|
(29)*
Функция ВзятьЦифры(Стр) Рез=СоздатьОбъект("СписокЗначений"); флЧисло=-1; ТекЧисло=""; ... |
|||
32
1Сергей
02.03.09
✎
12:32
|
(30) с чем?
|
|||
33
Fragster
гуру
02.03.09
✎
12:33
|
(32) с (17)
|
|||
34
Fragster
гуру
02.03.09
✎
12:33
|
(33) вернее с (15)
|
|||
35
Дуб
02.03.09
✎
13:03
|
(9) не надо компонент. Скриптом через COM к Винде обратись прямо из одноэски. Тут где-то примеры были..
|
|||
36
Fragster
гуру
02.03.09
✎
13:04
|
(35) долго читал?
|
|||
37
Дуб
02.03.09
✎
13:06
|
(36) :))) У меня автообновление отключено. Прошу прощения :)
|
|||
38
Z_Z
02.03.09
✎
13:25
|
Короче, остановился на посте № 15.
Быстро и качественно работает! Спасибо всем! |
|||
39
Shaman100M
02.03.09
✎
14:17
|
(0)Можно так еще
Слова = СтрЗаменить(СтрокаГдеИщем," ",РазделительСтрок); Для М1 = 1 По СтрКоличествоСтрок(Слова) Цикл Слово = СтрПолучитьСтроку(Слова,М1); Если (Число(Слово) <> 0) ИЛИ (Слово = "0") Тогда Сообщить(Слово); КонецЕсли; КонецЦикла; |
|||
40
genosse
02.03.09
✎
14:31
|
(38) Регулярные выражения быстро пишутся, но работают значительно медленнее чем обычные строковые функции. Поэтому насчет "быстро" я бы поспорил, если конечно объем действительно большой, как было сказано выше.
|
|||
41
Fragster
гуру
02.03.09
✎
14:58
|
(40) они работают быстрее, чем посимвольный перебор... тем более - такие простые (без вложенных выражений и вариантов)...
|
|||
42
Кириллка
02.03.09
✎
15:03
|
опять повторяюсь:
//_____________________________________________________________________________ // Функция ЭтоЦифра(Знач стрСимв) Перем КодСимвола; КодСимвола = КодСимв(стрСимв); Если (КодСимвола > 47) И (КодСимвола < 58) Тогда Возврат 1; КонецЕсли; Возврат 0; КонецФункции // ЭтоЦифра() //_____________________________________________________________________________ // Функция ЭтоТочка(Знач стрСимв) Перем КодСимвола; КодСимвола = КодСимв(стрСимв); Если (КодСимвола = 44) ИЛИ (КодСимвола = 46) Тогда Возврат 1; КонецЕсли; Возврат 0; КонецФункции // ЭтоТочка() //_____________________________________________________________________________ // Процедура ДобавитьТокен(сзРезультат, стрТокен) Если ПустоеЗначение(стрТокен) = 0 Тогда сзРезультат.ДобавитьЗначение(стрТокен); КонецЕсли; стрТокен = ""; КонецПроцедуры // ДобавитьТокен() //_____________________________________________________________________________ // Функция Разбор(Знач стрСтрока) Перем чТекПоз, стрТекСимв; Перем стрТокен, чДлина; стрТокен = ""; чТекПоз = 0; стрТекСимв = ""; чДлина = СтрДлина(стрСтрока); чКопить = 0; сзРезультат = СоздатьОбъект("СписокЗначений"); Пока 1 = 1 Цикл чТекПоз = чТекПоз + 1; стрТекСимв = Сред(стрСтрока, чТекПоз, 1); Если ЭтоЦифра(стрТекСимв) = 1 Тогда чКопить = 1; стрТокен = стрТокен + стрТекСимв; Если ЭтоТочка(Сред(стрСтрока, чТекПоз + 1, 1)) = 1 Тогда Если ЭтоЦифра(Сред(стрСтрока, чТекПоз + 2, 1)) = 1 Тогда стрТокен = стрТокен + Сред(стрСтрока, чТекПоз + 1, 1); чТекПоз = чТекПоз + 1; Иначе ДобавитьТокен(сзРезультат, стрТокен); чКопить = 0; КонецЕсли; КонецЕсли; Иначе Если чКопить = 1 Тогда ДобавитьТокен(сзРезультат, стрТокен); КонецЕсли; чКопить = 0; КонецЕсли; Если чТекПоз >= чДлина Тогда ДобавитьТокен(сзРезультат, стрТокен); Прервать; КонецЕсли; КонецЦикла; Возврат сзРезультат; КонецФункции // Разбор() //_____________________________________________________________________________ // Процедура Сформировать() Перем стрСтрока; Перем сзРез, стрТекЗнач; Перем чРазмер; стрСтрока = "опа123.45вы12,568ыа56и8.выамамыв54."; сзРез = Разбор(стрСтрока); чРазмер = сзРез.РазмерСписка(); Если чРазмер > 0 Тогда Сообщить("На вход: " + стрСтрока); Для Н = 1 По чРазмер Цикл стрТекЗнач = сзРез.ПолучитьЗначение(Н); Сообщить("--->: " + стрТекЗнач); КонецЦикла; КонецЕсли; КонецПроцедуры // Сформировать() |
|||
43
Fragster
гуру
02.03.09
✎
15:07
|
а если стрСтрока = "опа123.45.123вы12,568ыа56и8.выамамыв54."; ?
и этот кусок спорный: Если ЭтоТочка(Сред(стрСтрока, чТекПоз + 1, 1)) = 1 Тогда Если ЭтоЦифра(Сред(стрСтрока, чТекПоз + 2, 1)) = 1 Тогда стрТокен = стрТокен + Сред(стрСтрока, чТекПоз + 1, 1); чТекПоз = чТекПоз + 1; Иначе ДобавитьТокен(сзРезультат, стрТокен); чКопить = 0; КонецЕсли; КонецЕсли; |
|||
44
Кириллка
02.03.09
✎
15:15
|
(43)этот пример не вписывается в грамматику :)
Что спорного? |
|||
45
Fragster
гуру
02.03.09
✎
15:18
|
(44) как раз обработка .45.123
|
|||
46
Кириллка
02.03.09
✎
17:41
|
(45)Ну это не проблема, грамматика поправима:
//_____________________________________________________________________________ // Функция Разбор(Знач стрСтрока) Перем чТекПоз, стрТекСимв; Перем стрТокен, чДлина, чБылаТочка; стрТокен = ""; чТекПоз = 0; стрТекСимв = ""; чДлина = СтрДлина(стрСтрока); чКопить = 0; чБылаТочка = 0; сзРезультат = СоздатьОбъект("СписокЗначений"); Пока 1 = 1 Цикл чТекПоз = чТекПоз + 1; стрТекСимв = Сред(стрСтрока, чТекПоз, 1); Если ЭтоЦифра(стрТекСимв) = 1 Тогда чКопить = 1; стрТокен = стрТокен + стрТекСимв; Если чБылаТочка = 1 Тогда Если ЭтоТочка(Сред(стрСтрока, чТекПоз + 1, 1)) = 1 Тогда ДобавитьТокен(сзРезультат, стрТокен); чКопить = 0; чБылаТочка = 0; КонецЕсли; Иначе Если ЭтоТочка(Сред(стрСтрока, чТекПоз + 1, 1)) = 1 Тогда Если ЭтоЦифра(Сред(стрСтрока, чТекПоз + 2, 1)) = 1 Тогда стрТокен = стрТокен + Сред(стрСтрока, чТекПоз + 1, 1); чТекПоз = чТекПоз + 1; чБылаТочка = 1; Иначе ДобавитьТокен(сзРезультат, стрТокен); чКопить = 0; чБылаТочка = 0; КонецЕсли; КонецЕсли; КонецЕсли; Иначе Если чКопить = 1 Тогда ДобавитьТокен(сзРезультат, стрТокен); КонецЕсли; чКопить = 0; чБылаТочка = 0; КонецЕсли; Если чТекПоз >= чДлина Тогда ДобавитьТокен(сзРезультат, стрТокен); Прервать; КонецЕсли; КонецЦикла; Возврат сзРезультат; КонецФункции // Разбор() |
|||
47
у лю 427
02.03.09
✎
19:14
|
сделайте гашение через таблицы замен нечисловых символов на пробелы (с использованием массивов, а не ТЗ - летать будет), потом сожмите строку с удалением пробелом - сухой остаток и будет цифрами.... и числами....
|
|||
48
Fragster
гуру
02.03.09
✎
22:03
|
(47) не дофуя ли заменять? проще за 1 проход выцепить числа, тогда уж...
|
|||
49
Torquader
02.03.09
✎
23:30
|
(47) Замена потребует или порчи исходной строки или создания копии строки (что требует памяти). Простой проход не требует памяти, и, если его выполнять на языке низкого уровня, то будет достаточно быстро.
А вот применение функции XLAT перекодировки (или массива 256 байтов) - это оправданное ускорение (к счастью, 1С не UNICODE-система, и там массивы не по 65536 символов). |
|||
50
Gray-bird
03.03.09
✎
01:11
|
(0) Числа или цифры?
Потому как кроме "0123456789", придется корректно обрабатывать "-", и с дробной частью думать. |
|||
51
smaharbA
03.03.09
✎
05:28
|
(41) а как ты думаешь, как работают регулярные вырожения как глаз человека ?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |