Совпадение регулярных выражений, если за первым экземпляром string следует string — force lazy

#regex #tasker

#регулярное выражение #tasker

Вопрос:

Я пытаюсь вернуть совпадение, только если за первым экземпляром string следует другая строка. Однако они могут появиться позже, но тогда я не хочу совпадения.

 Thing #1
.........
hidden=true
.........
Thing #2
.........
hidden=false
.........
  

Прямо сейчас я использую Thing #1[Ss]*?hidden=false , но, очевидно, это вернет совпадение для приведенного выше примера, когда я этого не хочу. Только если за первым hidden= следует false . Я знаю, как это можно сделать с помощью группы захвата, но это сильно усложнило бы ситуацию для меня, я использую Tasker на Android, а группы захвата — это огромное испытание и медленно. Как я могу это сделать?

Комментарии:

1. Как насчет того, чтобы просто найти первое вхождение «hidden=» и проверить, является ли следующая за ним строка true или false. Регулярное выражение кажется излишним.

2. @Kelvin это может быть не первое вхождение. Я забочусь о первом появлении после «Thing #1». Позже они будут смешаны, и меня будут интересовать и другие.

3. Затем найдите индекс «Thing # 1», затем найдите первое вхождение «hidden=», начинающееся после индекса «Thing # 1».

4. @Kelvin Учитывая, что я использую Tasker, это уже сложнее, чем просто использовать группу захвата, которая является медленной и сложной.

5. Хм, если захват группы происходит медленно, то ожидания будут еще более тревожными 🙂

Ответ №1:

Вы близки. Вам просто нужно не допустить, чтобы другой Thing #1 объект находился между совпадающим объектом и следующим маркером.

Используйте отрицательный взгляд вперед:

 Thing #1((?!Thing #1)[Ss])*?hidden=false
  

Комментарии:

1. Ах, хорошо, я думаю, вы имеете Thing #1((?!hidden)[Ss])*?hidden=false в виду предотвращение каких-либо скрытых изменений до первого. Идеальный.

Ответ №2:

Это отрицательное регулярное выражение будет искать первый Thing #<number> экземпляр в тексте, если за ним следует hidden=false :

 ^.*?Thing #d (?:(?!hidden=(?:true|false))[Ss])*?hidden=false
  

Совпадения не будет, если hidden=true найдено первым.

Демонстрация регулярных выражений