от
У меня есть регулярное выражение в следующем
(ORDER\s BY)|(LIMIT)|$
. Я хочу вставить подстроку перед первым совпадением регулярного выражения. Я ищу чистое решение регулярных выражений в Голанге, не находя индекс, а затем добавляя подстроку. Так как Golang имеет только функцию regexp.ReplaceAll, которая заменяет все совпадения, а не первый.
exp := regexp.MustCompile(`(ORDER\s BY)|(LIMIT)|$`)
fmt.Println(exp.ReplaceAllString(str, "..."))
пример Ввод:
abcd ORDER BY LIMIT
substring =
GROUP BY
Ожидаемый результат:
abcd GROUP BY ORDER BY LIMIT
Ввод:
abcd LIMIT
Ожидаемый результат:
abcd GROUP BY LIMIT
             

Пожалуйста, войдите или зарегистрируйтесь для публикации ответа на этот вопрос.

2 Ответы

0 голосов
от
Вы можете использовать
str := "abcd ORDER BY LIMIT"
exp := regexp.MustCompile(`^(.*?)(ORDER\s BY|LIMIT|$)`)
fmt.Println(exp.ReplaceAllString(str, "${1}GROUP BY ${2}"))
Если перед шаблоном могут быть разрывы строк, используйте
(?s)
впереди:
(?s)^(.*?)(ORDER\s BY|LIMIT|$)
. Посмотрите демо Go и график регулярных выражений: подробности
^
- начало строки
(.*?)
- Группа 1 (
${1}
): любые 0 символов, как можно меньше
(ORDER\s BY|LIMIT|$)
- Группа 2 (
${2}
): любая из трех альтернатив, в зависимости от того, что наступит раньше:
ORDER\s BY
-
ORDER
, 1 пробелов,
BY
LIMIT
- подстрока
LIMIT
$
- конец строки.     
0 голосов
от
Я предполагаю, что это выражение может работать здесь:
(ORDER\s BY\s LIMIT|LIMIT)$
демонстрация Тестовое задание
package main

import (
    "regexp"
    "fmt"
)

func main() {
    var re = regexp.MustCompile(`(?m)(ORDER\s BY\s LIMIT|LIMIT)$`)
    var str = `abcd ORDER BY LIMIT
abcd LIMIT`
    var substitution = "GROUP BY $1"

    fmt.Println(re.ReplaceAllString(str, substitution))
}
    
...