Обнаружение определенной строки символов

Недавно у меня был школьный проект, который заставил меня бороться целую неделю. Мне действительно нужна помощь.

Моя программа принимает ввод строки и модифицирует ее, чтобы вернуть другую строку в верхнем или нижнем регистре, пока это работает. Но когда я вставляю: «Это так захватывающе (вверх, 2)», вывод остается прежним, хотя должен быть «Это ТАК ЗАХВАТЫВАЕТ». Моя цель состоит в том, чтобы иметь возможность обрабатывать случай: (вверх, n), зная, что слово, за которым следует «(вверх)», должно быть написано с большой буквы. Если ниже вы найдете соответствующую функцию.

Заранее спасибо !

// modifyUp converts words before (up) to uppercase
func modifyUp(line string) string {
    words := strings.Fields(line)
    var numWords int
    var numbers int

    for i, word := range words {
        if strings.HasSuffix(word, "(up)") && i > 0 {
            // Convert word(s) to uppercase
            numWords = 1
            if strings.Contains(word, ",") {
                // Handle comma-separated words
                numbers, _ = strconv.Atoi(strings.TrimSuffix(strings.Split(word, ",")[1], ")"))
                word = strings.TrimSuffix(word, fmt.Sprintf(",%d)", numbers))
                numWords += numbers
            } else {
                word = strings.TrimSuffix(word, "(up)")
            }
            // Convert preceding word(s) to uppercase
            for j := i - numWords + 1; j <= i; j++ {
                if j >= 0 {
                    words[j] = strings.ToUpper(words[j])
                }
            }
            // Replace modified word with original word
            words[i-numWords+1] = word
        }
    }
    return strings.Join(words, " ")

strings.HasSuffix(word, "(up)") не обнаруживает "(up, 2)".

Volker 01.04.2023 10:35

Попробуйте регулярное выражение "\\(up, (\\d+)\\)", и группа 1 будет иметь номер

Bohemian 02.04.2023 03:52

Уже сделано. Спасибо за все !

Moussa Fall 02.04.2023 05:37
В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
0
3
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я наконец нашел другой способ

func modifyUp(line string) string {
    words := strings.Fields(line)
    //var numWords int
    var numbers int

    for i, word := range words {
        if word == "(up," && i < len(words)-1 {
            ok := splitWord(words[i+1])
            if ok {
                wr := words[i+1]
                numbers, _ = strconv.Atoi(wr[:len(wr)-1])
                words[i], words[i+1] = "", ""
                for j := i - 1; j >= 0; j-- {
                    if numbers == 0 {
                        break
                    } else {
                        words[j] = strings.ToUpper(words[j])
                        numbers--
                    }
                }
            }
            break
        }
        if word == "(up)" && i > 0 {
            words[i-1] = strings.ToUpper(words[i-1])
            words[i] = ""
        }
    }

    return strings.Join(words, " ")
}

Спасибо всем за вклад

Как упоминалось в комментарии, вы проверяете конкретно (up), который не обнаружит (up, 2). Простой способ проверить это — добавить fmt.Println(word) в начале цикла for, чтобы проверить каждое слово, которое вы проверяете. В случае This is so exciting (up, 2) вы получаете

This
is
so
exciting
(up,
2)

Как видите, вместо (up, встречается (up). Кроме того, 2) отделен от чека.

Если мы сохраняем ту же логику, что и у вас в настоящее время, быстрое исправление выглядит следующим образом:

func modifyUp(line string) string {
    words := strings.Fields(line)
    var numWords int

    for i, word := range words {
        if (strings.HasSuffix(word, "(up)") || strings.HasSuffix(word, "(up,")) && i > 0 {
            // Convert word(s) to uppercase
            numWords = 1
            if strings.Contains(word, ",") {
                var numbers int

                // Handle comma-separated words
                numbers, _ = strconv.Atoi(strings.TrimRight(words[i+1], ")"))

                words[i] = ""
                words[i+1] = ""
                numWords = numbers
            } else {
                words[i] = ""
            }

            // Convert preceding word(s) to uppercase
            for j := i - numWords; j <= i; j++ {
                words[j] = strings.ToUpper(words[j])
            }
        }
    }
    return strings.Join(words, " ")
}

Я внес некоторые дополнительные изменения в код, чтобы заставить его работать после того, как вы правильно проанализировали файл up. Вы также можете убрать words[i-numWords+1] = word, так как вы уже заменяете его в конверсии.

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

Привет, у меня есть еще один вопрос в последней строке кода, которую я добавил return strings.TrimSpace(strings.Join(words, " ")), потому что после замены вхождения «(up)» функция добавляет пробел и два пробела с «(up, n)», что меня бесит.

Moussa Fall 09.04.2023 16:15

Я не уверен, что у вас есть вопрос, но это хороший улов. Причина, по которой есть пробел, заключается в том, что мы устанавливаем «(вверх) или (вверх, n)» как показанное пустое пространство. Более чистая версия кода - это если вы удалите их из массива слов вместо следующих кодовых слов [i] = "" или words[i+1] = ""

PWong 13.04.2023 09:52

Другие вопросы по теме