Как вставить подстроку перед первым совпадением в регулярных выражениях в Golang? - PullRequest
3 голосов
/ 04 июля 2019

У меня есть следующее регулярное выражение (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 ]

2 голосов
/ 04 июля 2019

Вы можете использовать

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 и график регулярных выражений :

enter image description here

Подробности

  • ^ - начало строки
  • (.*?) - группа 1 (${1}): любые 0+ символов, как можно меньше
  • (ORDER\s+BY|LIMIT|$) - группа 2 (${2}): любой из трех вариантов, в зависимости от того, что произойдет раньше:
    • ORDER\s+BY - ORDER, 1+ пробелов, BY
    • LIMIT - LIMIT подстрока
    • $ - конец строки.
0 голосов
/ 04 июля 2019

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

(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))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...