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


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


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С

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