Как установить регулярное выражение для строк, которые не начинаются с ‘/’ и не заканчиваются на ‘,’ или ‘.’ или ‘ ‘?

#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. Я понимаю. Тогда позор.