Как остановить поиск, если строка находится перед другой строкой в ​​Regex

Я новичок в регулярных выражениях, особенно продвинутых регулярных выражений (смотреть в будущее или смотреть в будущее),

У меня есть две строки,

  1. выбирайте шары, если они в красной сумке или в зеленой сумке
  2. выбирайте шары, если они в зеленой сумке или в красной сумке

Я хотел провести матч, только если перед первой "сумкой" линия будет красной. И не совпадать, если строка имеет красный цвет после 1-го "мешка" (поэтому совпадение 1, а не 2)

Если я использую следующее регулярное выражение,

sort.+?red(?!bag)

Или же

sort.+?(?!bag)red

Похоже, что он соответствует строке 2 в обоих случаях.

Любая подсказка / ответ приветствуется.

1 ответ

Решение

Этот делает работу:

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

Объяснение:

^               # 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

демонстрация

Другие вопросы по тегам