Недавно у меня был школьный проект, который заставил меня бороться целую неделю. Мне действительно нужна помощь.
Моя программа принимает ввод строки и модифицирует ее, чтобы вернуть другую строку в верхнем или нижнем регистре, пока это работает. Но когда я вставляю: «Это так захватывающе (вверх, 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, " ")
Попробуйте регулярное выражение "\\(up, (\\d+)\\)", и группа 1 будет иметь номер
Уже сделано. Спасибо за все !


Я наконец нашел другой способ
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)», что меня бесит.
Я не уверен, что у вас есть вопрос, но это хороший улов. Причина, по которой есть пробел, заключается в том, что мы устанавливаем «(вверх) или (вверх, n)» как показанное пустое пространство. Более чистая версия кода - это если вы удалите их из массива слов вместо следующих кодовых слов [i] = "" или words[i+1] = ""
strings.HasSuffix(word, "(up)") не обнаруживает "(up, 2)".