Вход | Регистрация


Форумы на Кубань.Ру


1С:Предприятие ::

Метки: 

Как лучше найти первое вхождение символа с конца строки ?

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




Список тем форума

Форум Территория 1С

Рекламное место пустует   Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует