Como parar de pesquisar se uma string ocorre antes de outra string no Regex

Como parar de pesquisar se uma string ocorre antes de outra string no Regex

Eu sou novo em regex, especialmente em regex avançado (olhe para trás ou para frente),

Eu tenho duas linhas,

  1. escolha bolas se elas estiverem na sacola vermelha ou na sacola verde
  2. escolha bolas se elas estiverem na sacola verde ou na sacola vermelha

Eu queria combinar apenas se a linha estiver vermelha antes da primeira 'bolsa'. E não corresponde se a linha estiver vermelha após a primeira 'bolsa' (então combine 1 e não 2)

Se eu usar o seguinte regex,

sort.+?red(?!bag)

Ou

sort.+?(?!bag)red

Ainda parece corresponder à linha 2 em ambos os casos.

Qualquer dica/resposta é apreciada.

Responder1

Este faz o trabalho:

^(?:(?!\bbag\b).)*\bred\b.+?\bbag\b

Explicação:

^               # beginning of line
                # tempered greedy token
  (?:           # start non capture group
    (?!         # negative lookahead
      \bbag\b   # "bag" surrounded with word boundary, not matching bags or airbag
    )           # end lookahead
    .           # any character
  )*            # end group, may appear 0 or more times
  \bred\b       # "red" surrounded with word boundary, not matching tired or redition
  .+?           # 1 or more any character, not greedy
  \bbag\b       # "bag" surrounded with word boundary

Demonstração

informação relacionada