Имя: Пароль:
1C
1C 7.7
v7: Найти первый не русский символ
,
0 beaver1971
 
09.07.15
16:51
Как найти в строке позицию первого не русского символа (цифры, знака препинания и т.д.)?
1 PR третий
 
09.07.15
16:53
(0) Эээ... а в чем проблема?
2 itlikbez
 
09.07.15
16:55
(0) С помощью цикла.
3 Garykom
 
гуру
09.07.15
16:55
сначала уточнить понятие "не русский символ" = составить перечень всех символов которые ищем
4 anatoly
 
09.07.15
16:57
задача для школьной информатики.
5 Волшебник
 
модератор
09.07.15
16:57
(3) лучше наоборот - перечислить русские
6 Garykom
 
гуру
09.07.15
16:58
(5) проще для программиста, не значит проще для компьютера
7 Casey1984
 
09.07.15
16:59
(3) ВРЕГ(Символ) >= "А" И ВРЕГ(Символ) <= "Я"
8 Fish
 
09.07.15
16:59
(6) НЕ русских символов гораздо больше, чем русских, поэтому для компьютера тоже проще.
9 spectre1978
 
09.07.15
16:59
Для Сч = 1 По СтрДлина (ВходСтр) Цикл

Если Найти ("АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзиклмнопрстуфхцчшщъыьэюя", Сред (ВходСтр, Сч, 1))=0 Тогда
Сообщить ("Нашли первый нерусский символ");
Прервать;
КонецЕсли;
КонецЦикла;
10 Casey1984
 
09.07.15
16:59
(7) ой в (0) хотел ответить)
11 Mikeware
 
09.07.15
17:00
цифра "3" - это русский символ? или уже арабский?
12 Garykom
 
гуру
09.07.15
17:00
(8) да но как бы по кодам проще проверить на вхождения в интервалы, чем на невхождения
13 Casey1984
 
09.07.15
17:00
(11) зависит от валюты)
14 Учитель
 
09.07.15
17:00
(9) Это ты вручную набирал от "А" до "Я" буквы?
15 Xapac
 
09.07.15
17:01
а буква i? это так то тоже русский. только не современный.
16 Fish
 
09.07.15
17:01
(9) Буквы "Ёё" и "Йй" потерял.
17 Mikeware
 
09.07.15
17:01
(13) 0,5 - точно русский....
18 Garykom
 
гуру
09.07.15
17:02
(14) думать что русский программист знает наизусть алфавит это несколько самонадеянно... хотя если 1С-ник...
19 Mirnin
 
09.07.15
17:02
(14) Обработку написал же, зачем вручную.
20 spectre1978
 
09.07.15
17:03
(16) ну это как бы каждый может добавить по желанию чего хочет. Может, там и цифры надо. Описанный механизм именно тем и удобен, что чего хочешь то и добавил в константу, и не надо париться с кодами
21 Timon1405
 
09.07.15
17:03
регэксп  [^а-я]/i не предлагать?
22 Xapac
 
09.07.15
17:04
мне вот интересно а если всякие там казахские или украинские кодировки. оно как? теже символы или другие, тока выглядят похоже?
23 Волшебник
 
модератор
09.07.15
17:04
(9) пропустил Й и Ё
24 Волшебник
 
модератор
09.07.15
17:05
(22) другие коды
25 Xapac
 
09.07.15
17:07
тада надо перевести всё в кодировку юникод и смотреть символы "Под символы кириллицы выделены области знаков с кодами от U+0400 до U+052F, от U+2DE0 до U+2DFF, от U+A640 до U+A69F"

https://ru.wikipedia.org/wiki/Юникод
26 Ёпрст
 
09.07.15
17:19
(0)
для клюшек, так, например

Если OEMToAnsi(Буква) = Буква Тогда
  Сообщить("Не русский символ");
КонецЕсли;
27 beaver1971
 
09.07.15
18:15
(26) есть строка, нужно найти позицию первого не русского символа....
Русские символы - только буквы русского алфавита
28 spectre1978
 
09.07.15
18:19
(24) Не совсем так. У основных символов коды будут совпадать. Кириллица в юникоде начинается с 0x400 и заканчивается 0x527, и что туда входит - достаточно легко посмотреть, использовав стандартное виндовое приложение charmap.exe с каким-нибудь распространенным шрифтом типа Arial.
29 spectre1978
 
09.07.15
18:27
+ (28) уточнение: по 0x52F. Еще есть несколько небольших диапазонов ближе к концу таблицы, но основной набор от 400 до 52F.
30 beaver1971
 
09.07.15
18:31
ха....
    Reg = СоздатьОбъект("VBScript.RegExp");
    ...
    Reg.Pattern = "(^[А-Я|а-я]*)*";
    ЧтоТоИщем = Reg.Execute(СтрокаПоиска);
    Нашли = СтрДлина(ЧтоТоИщем.Item(1).Value);

Вот только N * 1000 вызовов VBScript.RegExp, причем N даже не двузначное число (((((
31 romix
 
09.07.15
18:35
32 Casey1984
 
09.07.15
18:43
(31) вот эт да, 1с - сила)
33 Ёпрст
 
10.07.15
09:11
(27) и ?
34 aka AMIGO
 
10.07.15
09:35
Для ы=1 По СтрДлина(СтрокаДляАнализа) Цикл
Сим = Сред(СтрокаДляАнализа, ы,1);
Если КодСимв(Сим) <= 191 Тогда
Сообщить("Найдено! "+Сим+ " поз.= "+ы);
Прервать;
КонецЕсли;
КонецЦикла;
35 Timon1405
 
10.07.15
09:54
(30) прежде чем "хакать" ознакомьтесь с документацией особенно по использованию звездочки. ваш регэксп работает мягко говоря неоптимально. вот код для снеговика:
Перем RegExp;
Процедура КнопкаВыполнитьНажатие(Кнопка)
    Паттерн ="[^а-я]";
    RegExp.Pattern = Паттерн;
    ПоискСлов= RegExp.Execute(СтрокаПоиска);
    Если ПоискСлов.count() Тогда
        Сообщить(ПоискСлов.Item(0).FirstIndex);
    КонецЕсли;
КонецПроцедуры
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина; //Игнорировать регистр
RegExp.Global = Ложь; //Поиск всех вхождений шаблона
RegExp.MultiLine = Ложь; //Многострочный режим
36 beaver1971
 
10.07.15
10:19
(35)     СтрокаПоиска = "Аккумулятор СТ50";
Нужно увидеть число 12, как? )))
37 beaver1971
 
10.07.15
10:20
+(36) СтрокаПоиска = "Гвоздь 150 мм";
а тут результат - 7
38 Timon1405
 
10.07.15
10:22
(36) Индексы символов с 0 кагбе нумеруются, у вас неправильные ожидания от платформы. код из (35) у меня выдает 11 и 6, ЧЯДНТ?
39 beaver1971
 
13.07.15
06:52
(38) )))
СтрокаПоиска = "Аккумулятор";
40 SiAl-chel
 
13.07.15
08:43
(0)
НовыйТекст = ""
Для Сч = 1 По СтрДлина(Текст) Цикл
    Символ = Сред(Текст, Сч);
    Если КодСимвола(Символ) <= 1040 И КодСимвола(Символ) >= 1103 Тогда
        НовыйТекст = НовыйТекст + Символ;
    Иначе
        Прервать;
    КонецЕсли;
КонецЦикла;
Предупреждение(НовыйТекст);
41 SiAl-chel
 
13.07.15
08:44
+(40) Опечатался, вот тут правильней
НовыйТекст = ""
Для Сч = 1 По СтрДлина(Текст) Цикл
    Символ = Сред(Текст, Сч);
    Если КодСимвола(Символ) >= 1040 И КодСимвола(Символ) <= 1103 Тогда
        НовыйТекст = НовыйТекст + Символ;
    Иначе
        Прервать;
    КонецЕсли;
КонецЦикла;
Предупреждение(НовыйТекст);
42 SiAl-chel
 
13.07.15
08:45
+(41) :) Опять поторопился
НовыйТекст = ""
Для Сч = 1 По СтрДлина(Текст) Цикл
    Символ = Сред(Текст, Сч, 1);
    Если КодСимвола(Символ) >= 1040 И КодСимвола(Символ) <= 1103 Тогда
        НовыйТекст = НовыйТекст + Символ;
    Иначе
        Прервать;
    КонецЕсли;
КонецЦикла;
Предупреждение(НовыйТекст);
43 Serg_1960
 
13.07.15
09:27
Кто-то невнимательно читает - автору нужно найти позицию первого "нерусского" символа
44 Timon1405
 
13.07.15
10:35
(39) даже не смешно уже. ничего не выводит, а что должен выводить по вашему? если уж так нужно, отловите исключение в "Если ПоискСлов.count() Тогда"
45 SiAl-chel
 
13.07.15
14:58
(43) Тогда все еще проще
Позиция = 0;
Для Сч = 1 По СтрДлина(Текст) Цикл
    Символ = Сред(Текст, Сч, 1);
    Если КодСимвола(Символ) < 1040 И КодСимвола(Символ) > 1103 Тогда
        Позиция = Сч;
        Прервать;
    КонецЕсли;
КонецЦикла;
Предупреждение(Позиция);
46 SiAl-chel
 
13.07.15
14:59
+(45)
В условии вместо И поставить ИЛИ.
47 Злопчинский
 
13.07.15
15:31
бяка
куча лишнего в коде
.
Для Сч = 1 По СтрДлина(Текст) Цикл
    Символ = Сред(Текст, Сч, 1);
    Если КодСимвола(Символ) < 1040 И КодСимвола(Символ) > 1103 Тогда
        Предупреждение(сч);
        Прервать;
    КонецЕсли;
КонецЦикла;
48 SiAl-chel
 
20.07.15
06:45
(47) "Нет предела совершенству"
49 aka AMIGO
 
20.07.15
07:45
(47) хмык.. а "слабо" посмотреть в (34) ??? :)
кстати, почему 1040 и/или 1103 ?

вот эта простая штука возвращает все нужные коды и символы
Процедура Сформировать()
    Для ы=32 По 255 Цикл
        Сообщить(""+ы+"  "+Симв(ы));
    КонецЦикла;
КонецПроцедуры
50 zak555
 
20.07.15
08:10
(49) в 8 используется utf-8
другая кодровка
51 zak555
 
20.07.15
08:10
*кодировка
52 aka AMIGO
 
20.07.15
08:37
(50) ммм.. понятно, запомню :)
53 spectre1978
 
20.07.15
09:13
(50) По-моему, там используется обычный типовой для Windows UTF-16 Little Endian. UTF-8 чаще используется там где требуется экономия объема данных, а в приложениях обычно используют то что проще, т.е. UTF-16.
54 Salimbek
 
20.07.15
09:15
А пробел - это какой символ?
55 spectre1978
 
20.07.15
09:17
(54) Обычный, самый простой - U+0020. ASCII символы в юникоде совпадают по номерам со старой ASCII таблицей.
Независимо от того, куда вы едете — это в гору и против ветра!