Сопоставить то же или часть предыдущей сопоставленной группы - PullRequest
0 голосов
/ 17 сентября 2018

Я ищу способ сопоставить часть - или целую - ранее подобранную группу. Например, предположим, что у нас есть следующий текст:

this is a very long text "with" some quoted strings I "need" to match in their own context

Регулярное выражение типа (.{1,20})(".*?")(.{1,20}) дает следующий вывод:

# | 1st group           |   2nd group   |   3rd group
------------------------------------------------------------------
1 | is a very long text |   "with"      |   some quoted strings
2 | I                   |   "need"      |   to extract in their

Цель состоит в том, чтобы заставить регулярное выражение повторно сопоставлять часть 3-й группы с 1-го матча - или весь матч, когда строки в кавычках достаточно близки - когда совпадает со 2-й. По сути, я хотел бы получить следующий вывод:

# | 1st group           |   2nd group   |   3rd group
------------------------------------------------------------------
1 | is a very long text |   "with"      |   some quoted strings
2 | me quoted strings I |   "need"      |   to extract in their

Возможно, обратная ссылка поможет, но движку regex этого не хватает.

1 Ответ

0 голосов
/ 17 сентября 2018

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

Поскольку у вас нет заглядывания вперед, вы можете использовать regexp просто для сопоставления кавычек (или даже просто строк. Индекс), и просто получите байтовые диапазоны, затем расширьте, чтобы включить контекст самостоятельно, расширив диапазон (это может потребовать больше работы при работе со сложными строками UTF).

Что-то вроде:

input := `this is a very long text "with" some quoted strings I "need" to extract in their own context`

re := regexp.MustCompile(`(".*?")`)

matches := re.FindAllStringIndex(input, -1)

for _, m := range matches {
    s := m[0] - 20
    e := m[1] + 20
    if s < 0 {
        s = 0
    }
    if e >= len(input) {
        e = -1
    }
    fmt.Printf("%s\n", input[s:e])
}

https://play.golang.org/p/brH8v6OM-Fx

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