Как найти и заменить между персонажами - PullRequest
2 голосов
/ 20 марта 2019

Я пытаюсь заменить второе «И» на «ИЛИ» в следующей строке:

country == "BR" AND (leftHour >= 6 AND rightHour < 24)

Моя стратегия состоит в том, чтобы сделать это с помощью регулярного выражения: \((.*)\)Но это соответствует всем символам в скобках, и я просто хочу сопоставить AND между двумя скобками.

В Go было бы идеально, но хорошего регулярного выражения могло бы быть достаточно.

Редактировать: TheСтрока не является фиксированной, и мы можем иметь несколько «И», как, например, currency == "USD" AND country == "BR" AND (leftHour >= 6 AND rightHour < 24)

1 Ответ

5 голосов
/ 20 марта 2019

Вы можете использовать регулярное выражение типа \([^()]*\) для сопоставления строк внутри самых внутренних скобок и использовать ReplaceAllStringFunc только для замены всех AND на OR внутри сопоставленных текстов:

package main

import (
        "fmt"
        "strings"
        "regexp"
)

func main() {
        input := `country == "BR" AND (leftHour >= 6 AND rightHour < 24)`
        r := regexp.MustCompile(`\([^()]*\)`)
        fmt.Println(r.ReplaceAllStringFunc(input, func(m string) string {
                return strings.ReplaceAll(m, "AND", "OR")
        }))
}

См. Демонстрационную версию Go

Обратите внимание, что вы можете заменить AND с помощью второго регулярного выражения:

return regexp.MustCompile(`\bAND\b`).ReplaceAllString(m, "OR")

, который заменит AND, которые являются целымислова независимо от того, есть место или нет.См. эту демонстрацию Go .

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