LINUX.ORG.RU

golang: find substring index in runes

 


0

2

Не спал слишком давно, наверное запинаюсь на пустом месте. Да, golang вижу примерно пятый раз в жизни, пишу на java.

fmt.Println(strings.Index("Дата      Время   ", "Время"))
Каков должен быть результат, господа? Пробелов ровно столько, опечаток нет. Я удивлен результату. Может я слишком много пишу на java и упускаю очевидное?

★★

Последнее исправление: bytecode (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

Возвращает позицию в байтах. Но ТС спрашивал не про это.

ei-grad ★★★★★
()
Ответ на: комментарий от bytecode

Ну тогда нужно внимательно читать доку.

К слову в rust поиск по символам. Хз зачем так сделано в Go. Предполагаю там есть метод для поиска по символам.

RazrFalcon ★★★★★
()
Последнее исправление: RazrFalcon (всего исправлений: 1)

Работа с текстами должна быть узкой специализацией. Обычного типичного программиста подпускать к ней бессмысленно. Будет или ужас («нет языка кроме английского») или ужас-ужас («нет языков кроме английского и российского и нет кодировки кроме ASCII-based, и значит мой код типа работает с текстами, а не с огрызками кодпойнтов Unicode»)

dzidzitop ★★
()

дык рунами и всё норм.

а иначе тс грубо тролишь

anonymous
()
Ответ на: комментарий от bytecode

рун (rune) так и не нашёл?

зы. соболезную.

anonymous
()

Таки что тебя конкретно корробит?

https://play.golang.org/p/1jjgi12gkN

PS: и таки ты не совсем правильно используешь strings.Index. Он находит любое первое включение из sep, а не substr, как ты предполагаешь.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от beastie

проблема в том, что смещение байтовое, а не символьное (тут вопрос еще в том, когда нужен именно символьньій индекс, которьій открьіт), хотя в контексте слайсов, которьіе ничего про символьі не знают, все вроде ок. (так кто-то про rune говорил - IndexRune дает байтовое смещение)

anonymous
()
Ответ на: комментарий от RazrFalcon

К слову в rust поиск по символам.

Мойшет таки по code point-ам?

anonymous
()
Ответ на: комментарий от anonymous

проблема в том, что смещение байтовое, а не символьное

Это не проблема. А вот наоборот как раз проблема, т.к. извлечь символ из utf-8 строки по символьному смещению невозможно без прохода всей строки с начала.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Это не проблема. А вот наоборот как раз проблема, т.к. извлечь символ из utf-8 строки по символьному смещению невозможно без прохода всей строки с начала.

Зависит от представления строки: если масив байт - конвертация символьного индекса в байтовьій неудобна, если символ как примитив - байтовьій индекс проблема (тут можно посмотреть на джавишньіе строки с charAt/codePointAt/indexOf, где байтовьій индекс получить можно только через getBytes и итерирование по масиву, полученному после вьізова єтой функции) (ну и судя по ОП - таки проблема для ТС, хотя я не совсем понимаю use-case)

anonymous
()
Ответ на: комментарий от RazrFalcon

Хз зачем так сделано в Go.

Потому что golang делали люди, проторчавшие в криокамере последние 30 лет. Что кстати удивительно, ведь Rob Pike причастен к utf8, если мне память не изменяет.

hateyoufeel ★★★★★
()

В string у тебя может быть любая хрень, не обязательно валидный UTF-8, и тогда о символах говорить бессмысленно. Вот в частности поэтому.

anonymous
()
Ответ на: комментарий от anonymous

Кроме того, символ и unicode code point - это разные вещи, читайте Роба Пайка.

anonymous
()
Ответ на: комментарий от bytecode

чё и до сих пор нет ни кем(включая тебя) не написанной библиотеки(файла) где есть offline(ну алго есть быстрые и для online) поддержания для заданной myString соответствия между N0 и рунками?

зы. бяда бяда. тяжоло в колхозе утро

anonymous
()

Ну так обычному кодеру при работе с текстом нужны либо графемы, либо байты. Чуть ли не весь код, работающий с «символами» — багнут.

Символы нужны разве что для перевода из кодировки в другую.

x3al ★★★★★
()
Ответ на: комментарий от anonymous

Зависит от представления строки

В go из коробки одно представление строки.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от andreykyz

ну блин.

как тебе не стыдно?

найти не найденное что тс что битобайтокодом

anonymous
()
Ответ на: комментарий от RazrFalcon

К слову в rust поиск по символам.

Не распространяй ложную информацию про мой любимый язык.

fn find<'a, P>(&'a self, pat: P) -> Option<usize>
Returns the byte index of the first character of this string slice that matches the pattern.

pftBest ★★★★
()
Ответ на: комментарий от pftBest

Доу, это я с итератором попутал, которым обычно пользуюсь:

    let s = "Löwe 老虎 Léopard";
    if let Some(pos) = s.find('é') {
        println!("{}", pos);
    }

    if let Some(pos) = s.chars().position(|c| c == 'é') {
        println!("{}", pos);
    }
14
9

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Верно, но по итератору символов не найдешь подстроку. Так что это немного не то что хотел автор.

pftBest ★★★★
()
Ответ на: комментарий от andreykyz

Меня интересовал поиск индекса подстроки, а не конкретной руны. Задача уже решена, но тем не менее.

bytecode ★★
() автор топика

Совсем забыл про эту тему. Я не знаю, стоит ли тут капитанствовать, но если вдруг кому лень гуглить и поможет, то нужно считать руны

byteIndex = strings.Index(someString, substringWhichIndexYouAreSearchingFor)
index := utf8.RuneCountInString(someString[:byteIndex])

bytecode ★★
() автор топика
Ответ на: комментарий от andreykyz

Это очевидно. Ты писал

может сделать сначала вот так : runes := []rune(s)

что ты предлагал делать с массивом этих рун?

bytecode ★★
() автор топика
Ответ на: комментарий от andreykyz

Самому, обходом? Ну да, можно было, но меньше кода - меньше багов.

bytecode ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.