Имя: Пароль:
1C
 
Как лучше найти первое вхождение символа с конца строки ?
Ø
0 Yura
 
19.11.04
14:38
возможно-ли заставить работать Найти искать с конца ?
1 NS
 
19.11.04
14:40
1)перебором символов с конца строки
2)нахождением первого вхождения, и резкой строки.
2 Yura
 
19.11.04
14:43
Ну это понятно, я ожидал какое-то чудо, недокументуемую возможность :) Всё равно сенкс.
3 Дяпти
 
19.11.04
14:50
Пиши ВК. Даже в вонючем бейсике есть InStrRev
4 Oblomov
 
19.11.04
14:51
2(2) А чем документированная
позиция = Найти(СтрокаСимволов,разделительСтрок);
не подходит?
5 Начинающий юзер
 
19.11.04
14:52
2(4) Уже празднуем?
6 Yura
 
19.11.04
14:53
2)4( если у меня есть csv строка c неопределённым количеством полей, мне всегда нужно последнее удобно использовать НАЙТИ ?
7 Oblomov
 
19.11.04
14:54
2(5) А, что по твоему возвращает Найти(,)
8 Начинающий юзер
 
19.11.04
14:56
2(7)Вау, неужели ещет с конца строки?
9 Oblomov
 
19.11.04
14:58
2(6) Найти(СтрокаСимволов,разделительСтрок); возвращает позицию ПЕРВОГО вхождения символа КОНЦА СТРОКИ, что соответствует сабжу. А что тебе на самом деле нужно было, не знаю.
10 Дяпти
 
19.11.04
14:59
Найти("з_а_л_у_п_а","а") = 3 :-)))
11 Yura
 
19.11.04
14:59
7 - чувствую подвох, если знаешь ответ напиши, если позаёмывать хочешь то иди в другую ветку. Я считаю и РТФМ мне в этом помогает, что он возвращает первое вхождение символа с НАЧАЛА строки.
12 Начинающий юзер
 
19.11.04
15:00
2(9) Русским разговорным владеете? "Конец строки" и "с конца строки" - разные вещи....
13 sashat
 
19.11.04
15:01
Перевернуть строку с конца и использовать Найти().
Или перебором с конца строки.
14 mclarry
 
19.11.04
15:07
(13)Перевернуть... монитор - достаточно будет? ;))
15 sashat
 
19.11.04
15:10
Нет перевернуть монитор недостаточно. :)
Нужно лучше самому перевернуться.
16 Sure2
 
19.11.04
15:17
Предлагаю извратный способ! Работает, наверное, хуже чем посимвольный перебор ...Пока Сред(Стр,Н,1)<>Сим Цикл Н=Н-1...
Функция ПоискПоследнего(стр,симв)
  стр=""""+стрзаменить(стр,симв,""",""")+"""";
  сз=создатьОбъект("СписокЗначений");
  сз.ИзСтрокиСРазделителями(стр);
  Если сз.РазмерСписка()=0 Тогда Возврат 0; КонецЕсли;
  посл=сз.ПолучитьЗначение(сз.РазмерСписка());
  Возврат СтрДлина(стр)-СтрДлина(посл);
КонецФункции
17 Yura
 
19.11.04
15:18
16 - хм, что-то новенькое, интересно
18 Oblomov
 
19.11.04
15:18
2(12) ;-) Сори, это у меня с глазами плохо.
19 Начинающий юзер
 
19.11.04
15:23
2(18) Ничего страшного, бывает...
20 Yura
 
19.11.04
15:27
2(19) если нужен будет адвокат, я наберу :)
21 a13x
 
19.11.04
15:35
регескпы никто не отменял....
re = СоздатьОбъект("VBScript.RegExp");
правда, надо, чтобы wsh был установлен...
22 Сим
 
19.11.04
15:55
Реализация 2-го способа от NS
//*****************************************************************************
Функция глСтрПоследнееВхождение(Стр, Что) Экспорт
  
  Поз = Найти(Стр, Что);
  Пока Поз > 0 Цикл
    СтарПоз = Поз;
    Поз = Поз + Найти(Сред(Стр, Поз + 1), Что);
    Если СтарПоз = Поз Тогда
      Прервать;
    КонецЕсли;
  КонецЦикла;
  
  Возврат Поз;
  
КонецФункции //глСтрПоследнееВхождение
23 Mobilis
 
19.11.04
16:03
Тема уже обсуждалась. Мне понравился вариант avb :
  СтрЗаменить(МояСтрока,ИскомыйСимвол,Разделительстрок);
  ПоследнееВхождение=МояСтрока.КоличествоСтрок();
24 Uho
 
19.11.04
16:37
Функция НайтиСимвол(стр,символ)
   Если СтрЧислоВхождений(стр,символ)<2 Тогда
     Возврат Найти(стр,символ);
   Иначе
     позиция=Найти(стр,символ);
     Возврат позиция+НайтиСимвол(Прав(стр,СтрДлина(стр)-позиция),символ);
   КонецЕсли;
КонецФункции
25 Uho
 
19.11.04
16:41
Вот так получше:
Функция НайтиСимвол(стр,символ)
   позиция=Найти(стр,символ);
   Если СтрЧислоВхождений(стр,символ)<2 Тогда
      Возврат позиция
   Иначе
      Возврат позиция+НайтиСимвол(Прав(стр,СтрДлина(стр)-позиция),символ);
   КонецЕсли;
КонецФункции
26 mclarry
 
19.11.04
17:24
(23)Попробовал, получается довольно громоздко:
Если СтрЧислоВхождений(МояСтрока,ИскомыйСимвол) < 2 Тогда
  ПравПоз= Найти(МояСтрока,ИскомыйСимвол);
ИначеЕсли Прав(МояСтрока,СтрДлина(ИскомыйСимвол)) = ИскомыйСимвол Тогда
  ПравПоз= СтрДлина(МояСтрока)+1- СтрДлина(ИскомыйСимвол);
Иначе
  Строка2= СтрЗаменить(МояСтрока,ИскомыйСимвол,Разделительстрок);
  нСтрок= СтрКоличествоСтрок(Строка2);
  ПравПоз= СтрДлина(МояСтрока)+1- СтрДлина(ИскомыйСимвол)- СтрДлина(СтрПолучитьСтроку(Строка2,нСтрок));
КонецЕсли;
27 Uho
 
19.11.04
17:25
А помните из школы метод половинного деления (при поиске корня)?
Можно попробовать применить :))
Функция НайтиСимвол(стр,символ)
  позиция=0;
  Пока СтрЧислоВхождений(стр,символ)>1 Цикл
    половина=Прав(стр,Окр(СтрДлина(стр)/2));
    Если Найти(половина,символ)=0 Тогда
      стр=Лев(стр,СтрДлина(стр)-Окр(СтрДлина(стр)/2));
    Иначе
      позиция=позиция+СтрДлина(стр)-СтрДлина(половина);
      стр=половина;
    КонецЕсли;
  КонецЦикла;
  Возврат позиция+Найти(стр,символ);
КонецФункции
28 Пудель
 
19.11.04
17:43
(23) Великолепно!
29 Uho
 
19.11.04
17:54
(23) Чего-то я не пойму...
Это же тоже самое, что и
СтрЧислоВхождений(МояСтрока,ИскомыйСимвол)?
30 IAm
 
19.11.04
17:57
Что в 23 великолепного? Там же лажа абсолютная
31 Yura
 
19.11.04
18:01
30,29 - 23 это тоже самое что и со списком значений в (16) только работа с текстом, никакая не лажа, но самое оптимальное это перебор символов с конца строки.
32 IAm
 
19.11.04
18:03
В 23 же написано, что это вариант avb. Разве способен avb что-нибудь хорошее придумать?
33 Yura
 
19.11.04
18:05
надо было тогда написать - "Мой гений дарит вам вариант avb" :)
34 Uho
 
19.11.04
18:17
СтрЗаменить("аваава","в",Разделительстрок)=

аа
а"
КоличествоСтрок()=3
а ответ должен быть 5
Или тогда так:
СтрЗаменить(МояСтрока,ИскомыйСимвол,Разделительстрок);
Сообщить(СтрДлина(МояСтрока)-СтрДлина(МояСтрока.ПолучитьСтроку(МояСтрока.КоличествоСтрок())));
//подсмотрено у 16
35 Пудель
 
19.11.04
18:18
(29, 30, 32) 23 - это очень красиво. Со списком значений хуже, поскольку создаётся дополнительная переменная.
36 Спокойный
 
19.11.04
19:24
Ежли поюзать знаменитую и популярнцю среди профи ВК 1c.Addon, то последний символ будет находиться покороче :
Строка = ;
Симбол = ;
КоличествоСлов = WordAccount( Строка, Симбол );
Если КоличествоСлов > 1 Тогда
 НомерПозицииПоследнегоСимвола = WordPosition(КоличествоСимболов+1,Строка,Симбол);
Иначе
Сообщить( "Эгее !");
КонецЕсли
37 Спокойный
 
19.11.04
19:27
+36 немного себя поправлю - узрел ошибку
Строка = ;
Симбол = ;
КоличествоСлов = WordAccount( Строка, Симбол );
Если КоличествоСлов > 1 Тогда
 НомерПозПоследнегоСимвола = WordPosition(КоличествоСлов+1,Строка,Симбол);
Иначе
Сообщить( "Эгее !");
КонецЕсли
38 Fеникс
 
19.11.04
21:51
Видимо, в следующей ветке этого цикла следует ожидать тему "Как лучше помножить два на два?"
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.