#regex #delphi #delphi-10.1-berlin
#регулярное выражение #delphi #delphi-10.1-берлин
Вопрос:
У меня есть исходный код, и я хотел бы найти все строки, которые не заканчиваются символами запятой, точки или плюса ',' , '.' , ' '
,
Итак, у меня есть это: (,|.| )$
— показывать строки, которые заканчиваются любым из этих символов.
Но я хочу игнорировать строки, которые начинаются с // — прокомментированных строк, и им может предшествовать любое количество пробелов.
Я пробовал игнорировать строки с / в начале: ^[^/].*
но это не очень хорошо работает. Затем я также попытался поместить: s*
в начале, чтобы игнорировать все пробелы, но все еще плохо работает.
Итак, мое регулярное выражение было бы примерно таким: s*^[^/].*(,|.| )$
— пропустить все пробелы в начале И игнорировать те, в которых / в качестве первого символа И показывать те строки, которые заканчиваются на , .
Но это все еще находит строки, которые начинаются с пробела и / . Что я делаю не так?
РЕДАКТИРОВАТЬ: Вот примеры строк:
...
// increase no of objects...
counter := 1
2;
...
Мне нужно игнорировать строки комментариев, начинающиеся с //, но нужны все строки, заканчивающиеся на ., , поскольку мне нужно их переформатировать.
Комментарии:
1. Вы добьетесь гораздо большего успеха при многоходовом подходе — в командной строке я бы сделал это с помощью
grep -v
для фильтрации комментариев, а затем второйgrep
, которая ищет строки, которые вам действительно нужны . В противном случае вам нужно будет использовать расширения PCRE, что потребует механизма отслеживания регулярных выражений, который потенциально будет медленнее , чем простое применение двух символов по очереди.2. Для чего используется первое
^
в этом последнем регулярном выражении? Ты имел в видуs*[^/].*(,|.| )$
? Я тоже не уверен, сработает ли это, в зависимости от жадности…3. @Mike, попробуй
s*[^s/].*(,|.| )$
. Теоретически это не идеально, но, вероятно, должно сработать для ваших целей.4. Просто в качестве дополнительного примечания, IDE использует движок регулярных выражений, который поддерживает гораздо меньше, чем Delphis TRegEx — меня это смутило. Возможно, было бы лучшей идеей использовать что-то вроде Notepad , Sublime или пользовательскую программу Delphi для выполнения этой задачи.
5. Вот документ о регулярных выражениях IDE . IIRC GExperts поддерживает grep, возможно, это тоже стоит попробовать.
Ответ №1:
Единственный способ сделать это с помощью одного-единственного регулярного выражения — использовать отрицательный взгляд назад. Однако в итоге вы получите регулярное выражение, начинающееся с ^(?<!s*/)
, которое недопустимо из-за квантора в заднем взгляде.
Это означает, что единственный способ, который действительно работает, — использовать несколько регулярных выражений.
Нужные вам строки будут соответствовать этому (что буквально означает «запятая, точка или знак плюс в конце строки»):
[,. ]$
но не это (что буквально означает «ноль или более пробелов, за которыми следует косая черта в начале строки»):
^s*/
Комментарии:
1. Я не думаю, что смогу использовать 2 выражения… Я не могу выполнить поиск в результатах поиска.
2. @MikeTorrettinni Вы можете записать номера строк, которые совпадают.
3. Не совсем, слишком много кода. Вот почему я подумал, что сложное регулярное выражение поможет быстро это сделать.
Ответ №2:
Возможно, это может сработать:
^(?!/|s*/) .*[,. ]$
Это регулярное выражение игнорирует все строки, которые начинаются с /
или нуля или более пробелов, за которыми следует /
, и заканчиваются на ,
, .
или
.
Я надеюсь, у вас это работает.
РЕДАКТИРОВАТЬ: его можно уменьшить:
^(?!s*/) .*[,. ]$
Я тестировал это регулярное выражение, как вы можете видеть, оно игнорирует строку 192
и совпадение 210
, но оно не игнорирует строки внутри комментария к блоку, потому что оно не начинается с /
.
Комментарии:
1. Это может быть ограничение регулярного выражения в Delphi, потому что оно показывает ошибку;
A ?, , or * should follow a character
.2. Я никогда не кодировал на Delphi, но на других языках программирования, таких как Java, вам нужно экранировать некоторые символы, такие как
?
,или
*
, чтобы сказать, что это должны быть буквенные символы.3. Я пытаюсь, но не работает. Если я сбегу? тогда, конечно, он ничего не находит…
^(?!s*/) .*[,. ]$
4. @Mike, эта ошибка указывает на то, что Delphi не поддерживает отрицательный прогноз (
?!
) в своем процессоре регулярных выражений.5. Я понимаю. Тогда позор.