регулярное выражение для этого исключает совпадения в кавычках - PullRequest
3 голосов
/ 04 августа 2009

Я работаю над этим довольно большим проектом по рефакторингу и использую поиск / замену intellij с regexp, чтобы выручить меня.

Это регулярное выражение, которое я использую:

\b(?<!\.)Units(?![_\w(.])\b

Я считаю, что большинство совпадений, которые бесполезны для моей цели, это совпадения, которые встречаются со строками в кавычках, например: "единицы"

Я бы хотел найти способ, чтобы вышеприведенное выражение не совпадало, когда оно находит совпадающую строку между кавычками ...

Спасибо заранее, это место круто!

Ответы [ 2 ]

2 голосов
/ 04 августа 2009

Предполагая, что кавычки всегда соединены в заданной строке, вы можете создать совпадения до и после для четного числа кавычек и убедиться, что вся строка соответствует:

^([^"]*("[^"]*")*[^"]*)*\b(?<!\.)Units(?![_\w(.])\b([^"]*("[^"]*")*[^"]*)*$

это работает, потому что фрагмент

([^"]*("[^"]*")*[^"]*)*

будет соответствовать только парным кавычкам. При добавлении якорей начала и конца строки кавычки в левой и правой части вашего регулярного выражения будут равны.

Это не будет обрабатывать встроенные экранированные кавычки должным образом, и строки с многострочными кавычками будут проблемой.

1 голос
/ 04 августа 2009

Intellij использует регулярные выражения Java, не так ли? Попробуйте это:

(?m)(?<![\w.])Units(?![\w(.])(?=(?:[^\r\n"\\]++|\\.)*+[^\r\n"\\]*+$)

Первая часть - это ваше регулярное выражение после небольшой косметической операции:

(?<![\w.])Units(?![\w(.])

\b в начале и в конце были фактически такими же, как отрицательный взгляд назад и отрицательный взгляд (соответственно) для \w, поэтому я сложил их в ваши существующие обходные пути. Новый заголовок соответствует остальной части строки, если он содержит четное число (включая ноль) неэкранированных кавычек:

(?=(?:[^\r\n"\\]++|\\.)*+[^\r\n"\\]*+$)

Это относится к патологическим случаям, подобным тому, на который указал Уэлбог, и в отличие от регулярного выражения Майкла, он найдет несколько вхождений текста в одной строке. Но это не учитывает комментарии. Является ли функция поиска / замены Intellij достаточно умной, чтобы игнорировать текст в комментариях? Если подумать, разве не встроена поддержка рефакторинга?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...