#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
найдено первым.