Имя: Пароль:
1C
 
Русские буквы в строке
0 1с80
 
29.01.07
12:08
Как проверить наличие русских букв в строке (и вообще каких либо символов из заданного набора недопустимых)?
1 coder1cv8
 
29.01.07
12:11
(0) регулярные выражения заюзать, например...
2 1с80
 
29.01.07
12:13
(1) не очень понял рекомендацию )
3 Salvador Limones
 
29.01.07
12:14
(2) RegExp заюзать, например...
4 Истина
 
29.01.07
12:14
По диапазонам кодов символов или сравнением из массива русских букоффф.
5 coder1cv8
 
29.01.07
12:16
(3) И я об этом...
(2) книжка Михайлова "Системное программирование...", там об этом есть немного...
6 Истина
 
29.01.07
12:18
(1,3) Вы чего говорите то?  Афтар спрашивает про буквы-символы, а не про слова. Зачем ему нечеткое сравнение???
7 Ц_У
 
29.01.07
12:19
Ну можно руками
Для каждго буква из строка цикл
если буква = "а" тогда русская
...
иначеесли буква = "я" - русская и т.д.
8 MikleV
 
29.01.07
12:19
(6) дак там же вроде можно указать принадлежность алфавиту?
или я чего то путаю .
9 MikleV
 
29.01.07
12:20
+ для всех букв в строке
10 1с80
 
29.01.07
12:25
(6) да, я спрашиваю про буквы-символы, нечеткое сравнение не надо )
(7) руками то понятно как, но не хочется ... думал, может какую встроенную функцию не заметил?
11 coder1cv8
 
29.01.07
12:34
Не понимаю я в чём сложность поиска букв/символов с помощью RegExp?
12 1с80
 
29.01.07
14:08
Сложнотсь в том, что раньше с regexp не работал
Можно пример пример кода - как ее использовать?
Шаблон что-то типа [^А-Я*] должен быть?
13 Ц_У
 
29.01.07
14:09
Поиск не работает? или лень?
14 1с80
 
29.01.07
14:10
не нашел пока ...
15 smaharbA
 
29.01.07
14:15
//*******************************************
Процедура Сформировать()
   рег=СоздатьОбъект("VBScript.RegExp");
   Рег.global=-1;
   Рег.ignorecase=-1;
   Рег.pattern="[а-я]";
   Сообщить(Рег.test("есть русские bukovy"));
   Сообщить(Рег.test("netu russ bukov"));
КонецПроцедуры
16 1с80
 
29.01.07
14:17
спасибо
17 Билли Г
 
29.01.07
14:19
(15)Сообщить(Рег.test("how about Ё?"));
18 smaharbA
 
29.01.07
14:22
(17) не докапывайся дядя Билли
19 smaharbA
 
29.01.07
14:23
[а-яё]
20 1с80
 
29.01.07
14:26
все получилось, еще раз спасибо )
21 Ц_У
 
29.01.07
14:44
У меня вопрос, а можно ли узнать список этих самых букв?
22 coder1cv8
 
29.01.07
14:48
(21) можно
23 Ц_У
 
29.01.07
15:13
<code>
// И правда можно
Procedure СодержитСимволыКириллицы(myString,myStat)
   RegExp=New COMОбъект("VBScript.RegExp");
   RegExp.global=-1;
   RegExp.ignorecase=-1;
   RegExp.pattern="[а-яё]";
   rezult=RegExp.execute(myString);
   if rezult.Count>0 then
   for i=0 to rezult.Count-1 do
       Message("Cимвол кириллицы = "+rezult.item(i).Value);
   enddo;    
   else Message("Нет кириллических символов!");
   endif;
   if myStat<>Undefined Тогда
       myStat=?(RegExp.test(myString),"Содержит","Не содержит");
   endif;    
EndProcedure
</code>
24 Ц_У
 
29.01.07
15:35
<code>
Свойства объекта RegExp:
Pattern  Строка, содержащая регулярное выражение. Должна быть задана до использования методов RegExp
IgnoreCase Тип Boolean. Если True, то игнорирует регистр символов, по-умолчанию False.
Global Тип Boolean. Если True, то RegExp будет пытаться найти все возможные соответствия в строке.
Multiline  Тип Boolean. Если True, то RegExp будет поддерживать многострочный режим, по-умолчанию False.

Методы объекта RegExp:
Test(search-string) Тестирует строку search-string на соответствие паттерну. В случае удачи возвращает True.
Replace(search-string, replace-string) Метод имеет два аргумента: строку, в которой будет осуществляться поиск и строку замены. Все найденные соответствия в строке search-string, заданные в Pattern, будут замещены значениями, указанными в строке замены replace-string.
Excecute(search-string) Работает как Test, только все найденные соответвия в строке search-string, заданные в Pattern, будут возвращены в коллекции MatchCollection (см. ниже), содержащей объекты Match.


Объект MatchCollection

Содержит коллекцию объектов соответствия Match. Имеет два свойства:
Count возвращает количество найденных соответствий,
Item содержит объект Match с индексом от 0 до Count - 1.
В VBScript RegExp версии 5.5 Item является свойством default, т.е.
к свойству Item обращаться не обязательно, т.е. при обращении
к объекту типа Matches Item можно опускать.

Объект Match

Объект Match (IMatch2) содержит найденное в строке соответствие, заданное в паттерне поиска. Имеет 4 свойства: Метод  Назначение
FirstIndex Позиция найденного соответствия в строке
Length Длина найденной строки
Value Текст найденного соответствия
SubMatches Колекция субсоответствий. Субсоответствия
задаются группировкой с помощью круглых скобок "(" и ")" (см.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/jsgrpregexpsyntax.asp).


Объект SubMatches

Содержит коллекцию субсоответствий. Это как бы соответствия в соответствии. Имеет два свойства:
Count - количество найденных субсоответствий и
Item (default - можно опустить) возвращает текст найденного субсоответствия с индексом от 0 до Count - 1.

Например, задан RegExp паттерн '(\d*)\.?(\d*)', строка поиска '123.45', тогда коллекция
SubMatches вернет нам Count = 2, Item[0] = '123' и Item[1] = '45'.

Примечание:
при использовании библиотеки типов VBScript RegExp версии 1.0 свойство Item
не является default и его нужно указывать явно. Также отсутсвуют свойство
Multiline у объекта RegExp (IRegExp) и свойство SubMatches у объекта Match (IMatch).

</code>
25 Ц_У
 
29.01.07
15:37
//И еще раз
Свойства объекта RegExp:
Pattern  Строка, содержащая регулярное выражение. Должна быть задана до использования методов RegExp
IgnoreCase Тип Boolean. Если True, то игнорирует регистр символов, по-умолчанию False.
Global Тип Boolean. Если True, то RegExp будет пытаться найти все возможные соответствия в строке.
Multiline  Тип Boolean. Если True, то RegExp будет поддерживать многострочный режим, по-умолчанию False.

Методы объекта RegExp:
Test(search-string) Тестирует строку search-string на соответствие паттерну. В случае удачи возвращает True.
Replace(search-string, replace-string) Метод имеет два аргумента: строку, в которой будет осуществляться поиск и строку замены. Все найденные соответствия в строке search-string, заданные в Pattern, будут замещены значениями, указанными в строке замены replace-string.
Excecute(search-string) Работает как Test, только все найденные соответвия в строке search-string, заданные в Pattern, будут возвращены в коллекции MatchCollection (см. ниже), содержащей объекты Match.


Объект MatchCollection

Содержит коллекцию объектов соответствия Match. Имеет два свойства:
Count возвращает количество найденных соответствий,
Item содержит объект Match с индексом от 0 до Count - 1.
В VBScript RegExp версии 5.5 Item является свойством default, т.е.
к свойству Item обращаться не обязательно, т.е. при обращении
к объекту типа Matches Item можно опускать.

Объект Match

Объект Match (IMatch2) содержит найденное в строке соответствие, заданное в паттерне поиска. Имеет 4 свойства: Метод  Назначение
FirstIndex Позиция найденного соответствия в строке
Length Длина найденной строки
Value Текст найденного соответствия
SubMatches Колекция субсоответствий. Субсоответствия
задаются группировкой с помощью круглых скобок "(" и ")" (см.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/jsgrpregexpsyntax.asp).


Объект SubMatches

Содержит коллекцию субсоответствий. Это как бы соответствия в соответствии. Имеет два свойства:
Count - количество найденных субсоответствий и
Item (default - можно опустить) возвращает текст найденного субсоответствия с индексом от 0 до Count - 1.

Например, задан RegExp паттерн '(\d*)\.?(\d*)', строка поиска '123.45', тогда коллекция
SubMatches вернет нам Count = 2, Item[0] = '123' и Item[1] = '45'.

Примечание:
при использовании библиотеки типов VBScript RegExp версии 1.0 свойство Item
не является default и его нужно указывать явно. Также отсутсвуют свойство
Multiline у объекта RegExp (IRegExp) и свойство SubMatches у объекта Match (IMatch).
26 Ц_У
 
29.01.07
18:08
//Вот так еще
Function StringParser(myString)
   RegExp=New COMОбъект("VBScript.RegExp");
   RegExp.global=true;
   RegExp.ignorecase=false;
   RegExp.pattern="[А-ЯЁ|A-Z]";
   rezult=RegExp.execute(myString);
   result = myString;
   if rezult.Count>0 then
       for i=0 to rezult.Count-1 do
           RegExp.pattern=rezult.item(i).Value;
           result=RegExp.Replace(result," "+Lower(rezult.item(i).Value));
       enddo;    
   endif;
   result = TrimAll(result);
   FirstChar = Left(result,1);
   OtherChar = Right(result,StrLen(result)-1);
   result=Upper(FirstChar)+OtherChar;
   return result;
EndFunction
27 Ковычки
 
29.01.07
18:58
(26) Че это такое ?
28 k23
 
29.01.07
19:47
КодСимвола
29 Ковычки
 
29.01.07
19:50
(28) в строке из 1000000 символов ?
30 k23
 
29.01.07
20:01
(29)  да хоть из квадрилиона. нет других способов. регэкспы томозней на 2 порядка.
31 у лю 427
 
29.01.07
20:04
фигня...
Всем одноЭсникам слабо нарисовать алгоритм, который одной проверкой скажет, русская буква или иная....
32 k23
 
29.01.07
20:04
да и нехрен такие строки делать. сделал - думай как с ними работать будешь.
33 k23
 
29.01.07
20:06
(31) какой такой алгоритм, мудрый ты наш? цикл от 1 до 1000000 с проверкой в попадание в диапазона? это и пьяный первокласник нарисует без проблем.
34 у лю 427
 
29.01.07
20:10
(33) это только лохи проверяют диапазон...


P.S. если ты никогда не занимался именно системным программированием - ты не скажешь... Вообще то этот принцип широко используется в сист модулях...
35 k23
 
29.01.07
20:16
(34) открой тайну, как это не лохи делают?
в сист модулях сидят какие-то волшебные алгоритмы?
36 у лю 427
 
29.01.07
20:21
(35) обычно системные модули хорошо оптимизируются... ибо они вертятся постоянно...

Способов два - один через таблицы перекодировки (перекодирование осуществляется без оператора ЕСЛИ)
второй - название не помню, но он довольно редкий...
37 MAG
 
29.01.07
20:28
(35) По коду символа.
38 k23
 
29.01.07
20:29
(35) да хоть на асме с mmx - смысл один - посимвольный перебор с попаданием в значение. если не нравится - индексирование, регламентное либо при занесении/изменении. гугль десктоп, например и иже с ним. для таблиц памяти не напасёшся. юникод в базе (утф8).
39 Ковычки
 
29.01.07
20:29
(30) Да ну ?
40 k23
 
29.01.07
20:30
(39) может потестируем, что быстрей КодСимвола или вайсик внешний?
41 Ковычки
 
29.01.07
20:30
Друк ты горячишся сильно, хошь в 1С "открою" строку в 1 мГб ? можно и более...
42 Ковычки
 
29.01.07
20:30
(40) а че мне тестить, я и так знаю
43 k23
 
29.01.07
20:33
(41) да хоть в 10г, толко нужно мозгой думать - как ты там что-то искать будешь.
или скуль какой волшебник? он тебе твои 10г выгрузит в своп и будет посимвольно твою русскую букву искать.
44 у лю 427
 
29.01.07
20:42
я не знаю, как работает поиск в скуле, но эти алгоритмы очень быстрые...
(37) похоже, сталкивался с таблицами перекодировки...
45 Ковычки
 
29.01.07
20:48
(43) а че мне думать, от этого кони дохнут
46 Ковычки
 
29.01.07
20:51
Понятно, что в конечном итоге кодсимв, но это не тот кодсимв
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан