Получить всю группу по полям из запроса - PullRequest
3 голосов
/ 04 июля 2019

Мне нужно получить все group by поля из запроса https://play.golang.org/p/5h_IExbQb_D

package main

import (
    "fmt"
    "regexp"
)

func main() {
query := `SELECT sum(a) as a, count(b) as b, c as c, d as d, e as e
    FROM table
    group by c, d, e order by c`
    re := regexp.MustCompile(`(group by) ((.)*,?)*`)
    fmt.Printf("%q\n", re.FindAll([]byte(query), -1))

}

возвращает:

["group by c, d, e order by c"]

Но ожидаемый результат -

["c, d, e"]

Ответы [ 2 ]

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

В вашем шаблоне вы используете 3 группы захвата.

Вы можете использовать одну группу захвата и получить к ней доступ в коде для захвата c, d, e.

\bgroup by (\w+(?:, \w+)*)

Объяснение

  • \bgroup by Группа совпадений с предшествующей границей слова \b
  • ( Группа захвата
    • \w+ Совпадение 1+ слово chars
    • (?:, \w+)* Повторить 0+ раз, сопоставляя пробел и 1+ слово символов.
  • ) Закрыть группу захвата

Вы можете расширить соответствие \w, используя класс символов [\w] и добавить то, что вы хотите сопоставить.

Regex demo

1 голос
/ 04 июля 2019

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

group by ((?:\S*,\s)+\S*)

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...