Имя: Пароль:
1C
 
Как определить что в строке только цифры и латинские буквы?
0 HelpFinder
 
06.06.08
16:10
Нужно реализовать функцию, которая бы отсеивала определяла есть ли в строчке символы отличные от латинских букв и цифр? Как бы сделать это
1 Fragster
 
гуру
06.06.08
16:11
ну, например на javascript через регэксп
2 Terv
 
06.06.08
16:11
а в чем проблема?
3 ДенисЧ
 
06.06.08
16:12
для каждого символа строки сравнить его на вхождение в интервал от КОдСимв("0") до КодСимв("Z")
Только я не помню с ходу, Сначала цифры, потом буквы или наоборот. А так множество латинских букв в таблице кодировки плотное
4 Terv
 
06.06.08
16:15
ЦифрыИЛатиница = "1234567890qwertyuiopasdfghjklzxcvbnm";

Результат = "";
Для сч = 1 по СтрДлина(ПроизвольнаяСтрока) Цикл
 Если Найти(Врег(ЦифрыИЛатиница), Врег(Сред(ПроизвольнаяСтрока,Сч,1))) > 0 Тогда
    Результат = Результат + Сред(ПроизвольнаяСтрока,Сч,1);
 КонецЕсли;
КонецЦикла;
5 Ёпрст
 
гуру
06.06.08
16:17
(0) нет ничего проще :

Если Стр = OemToAnsi(Стр) Тогда
 Сообщить(" английская строка блин");
Иначе
 Сообщить(" есть русские буковки в строке ..");
КонецЕсли;

ЗЫ: Можешь проверять и посимвольно.
6 Fragster
 
гуру
06.06.08
16:18
(5) а непечатные символы в диапазоне до 127 символа не учтены!
7 HelpFinder
 
06.06.08
16:20
(5)оригинально ))
спасибо всем
8 Ёпрст
 
гуру
06.06.08
16:22
(6) Непечатные символы уже английскими стали?
9 Ёпрст
 
гуру
06.06.08
16:22
+8 Или, к примеру, © - какой символ?
10 regniws
 
06.06.08
16:23
сам всегда пользую (5), но как-то пошло это..
не находите!?
11 Fragster
 
гуру
06.06.08
16:26
(8),(9) ну, главное, что ты меня правильно понял. копилевты, евры, фунты, кавычки и прочая шняга - оем2анси нифига не поменяет - ибо кода - <= 127 :)
12 Господин ПЖ
 
06.06.08
16:29
слабо до 400 дотянуть?
13 Fragster
 
гуру
06.06.08
16:31
scr = СоздатьОбъект("MSScriptControl.ScriptControl");
scr.language = "javascript";
scr.addcode("a = "+МояСтрока);
Латинские = scr.eval(?(a == a.replace(/[a-z,A-Z,0-9]/,""),1,0))
14 regniws
 
06.06.08
16:32
(13) а смысл остался тот же, тем более еще и медленнее.
а если у нас, допустим, словарь произвольный?
15 Fragster
 
гуру
06.06.08
16:32
(13) ой, кавычки забыл :)
16 Fragster
 
гуру
06.06.08
16:33
(14) ни фига не медленнее - нету цикла с 26+26+10 итерациями
17 Fragster
 
гуру
06.06.08
16:34
(14) и что значит - словарь производный? регэксп - очень мощная штука, рекомендую. а вообще там не replace, а match надо использовать, но лень в мануалы лезть...
18 HelpFinder
 
06.06.08
16:36
Кстати как раз я на самом деле под WEB пишу на АСП и 1С77. поэтому такие вопросы и пошли )
19 regniws
 
06.06.08
16:36
(16) сложность получается на обычном
О(ДлинаСловаря*ДлинаСтроки)

Понятное дело, что реплейс из СкриптКонтроля работает таким же перебором, просто низкоуровневым, но на все эти ком-взаимодействия - время много уходит.

На 1с, просто рассмотреть чисто алгоритмческую задачу.
20 regniws
 
06.06.08
16:37
(17) словарь произвольный(!),
например: словарь hex символов "01234567890xabcdefXABCDEF"
21 Fragster
 
гуру
06.06.08
16:40
просто, регэкспом, например, можно проверить валидность формата емэйла или урла намного более читабельно, чем то же самое на 1с делать. Просто я уверен, что задача далеко не целиком состоит в определении наличия/остутствия каких-то букв - а тут уж регэкспы рулят
22 regniws
 
06.06.08
16:42
(21) я не спорю, проверка валидности строки установленному шаблону - регэксп.

Но это из пушки по воробьям в данном случае :)



и все же !? :) Идеи?

собственно, сам обдумываю хэширование сейчас.
23 Fragster
 
гуру
06.06.08
16:43
(20) опять же проверять по строке 0[х,Х][0-9,A-F,a-f] (или что-то типа того) легче, чем проверять, является ли первые символы 0x, или 0Х а потом остальную часть...
24 regniws
 
06.06.08
16:48
хм.. собственно придумал :))))))
не экономный к памяти, но зато мы решаем все за один проход.

общая схема, кому знакомы плюсы, поймут:

bool Dict[256] ;

memset(&Dict[0], sizeof(Dict), 0); //изначально все в массиве фолс;
//выставляем дальше в true все коды, которые валидны
Dict['0'] = true ;
Dict['1'] = true ;
Dict['2'] = true ;
Dict['3'] = true ;
....
Dict['x'] = true ;
Dict['z'] = true ;

int stLen = strlent(testString);
bool valid = true ;

for( int i =0; i<stLen ; i++ )
 if(!Dict[testString[i]]){valid = false; break;}



кому не понятно, дам каменты.

задача решена за время o(длинаМассива)
25 Лефмихалыч
 
06.06.08
16:51
(24) ну, да, ни кто ж не сказал ни чо про 1С
26 Fragster
 
гуру
06.06.08
16:51
(24) на 1се можно то же написать
27 Лефмихалыч
 
06.06.08
16:52
А вообще, эта тема рискует стать конкурентом v8: Как узнать - Четное число или нет?
28 Fragster
 
гуру
06.06.08
16:52
правла через список значений :)
29 Fragster
 
гуру
06.06.08
16:52
(27) ну так пятница-то ненастоящая!
30 regniws
 
06.06.08
16:53
(25,26) ну да, я просто быстро накидал, на 1с будет почти тоже самое, просто код объемней чутку, а смысл тот же.

:))) теперь со спокойной душой можно утвердить, что тема закрыта!? :)
31 regniws
 
06.06.08
16:53
(28) если 8ка, то там есть объект Массив, так что и без списков обойдемся :)
32 Ёпрст
 
гуру
06.06.08
17:03
(31) В семёрке, как ни странно тоже есть массив .
33 regniws
 
06.06.08
17:07
(32) ууууууупц :))))))) "как это было давно.... "
Просто переклино, что в 8ке он отдельным объектом выделен.
34 Fragster
 
гуру
07.06.08
11:20
(28) тут смысл не в том, есть массив, или нет, а в том, что индексами этого массива является наш алфавит - в 1с этого нету, в 8 есть соответствие, а из 7.7 подойдет список значений как раз...
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn