Имя: Пароль:
1C
 
Поиск числовых символов в строке...
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) а как ты думаешь, как работают регулярные вырожения как глаз человека ?