![]() |
![]() |
![]() |
|
Как лучше найти первое вхождение символа с конца строки ? Ø |
☑ | ||
---|---|---|---|---|
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
|
Видимо, в следующей ветке этого цикла следует ожидать тему "Как лучше помножить два на два?"
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |