2010-01-11 3 views
0

Я пытаюсь найти все вхождения моего конкретного слова (вызов метода с устаревшим API) во все файлы в каталоге. регулярное выражение, чтобы найти все такие вхождений, которые не содержат обновленный вызов (новый API) Можете ли вы помочь мне, пожалуйстаRegexp: возможно ли найти строку 'string', но не 'string ({'

Пример:.?

  • осуждается апи: метод (а, б, в)
  • новый метод api: ({a: a, b: b, c: c})

Регулярное выражение должно найти все файлы, содержащие метод 'method', но не 'method ({'.

спасибо.

+0

Что-то вроде 'method ([^ {]'? Или 'method \ s * (\ s * [^ {]', если вы хотите разрешить пробелы.Кроме того, я предлагаю проверить учебное пособие по адресу http://www.regular-expressions.info/ - каждый программист должен знать основные регулярные выражения! – laura

ответ

2

Я бы сказал, что правильный способ заключается в использовании отрицательного оператора опережающую, ?!

/method(?!\(\{)/ 

Вышеуказанные государства, «любое вхождение method, которое не с последующим ({»

Он отвечает вашим требованиям лучше, чем предложенный /method([^{]/, поскольку последний не соответствует концу строки (то есть abc abc method), и он не обрабатывает сочетание двух символов ({, которые вы просили очень хорошо.

+0

правильный, моя версия соответствует только методу' ', а не' method'; это то, что я * думаю * OP хочет , но вопрос немного неоднозначен. Если мы специально ищем вызовы функций, для большинства языков требуется '(', поэтому включение в него будет ловить вызовы функций, а не (например) комментарии, содержащие слово 'method' –

+1

И , чтобы убедиться, что мы не выбрасываем пробелы, вы можете использовать '/ method (?! \ s * \ (\ s * \ {) /'. –

+0

Мне любопытно, 'не обрабатывает комбинацию из двух символов, хотя. Не могли бы вы уточнить? –

2
betelgeuse:tmp james$ echo " method(a,b,c) "> test1 
betelgeuse:tmp james$ echo " method(a,b,c) " > test3 
betelgeuse:tmp james$ echo " method({a:a, b:b, c:c})" > test2 
betelgeuse:tmp james$ grep "method([^{]" test* 
test1: method(a,b,c) 
test3: method(a,b,c) 

Для объяснения: [ ] определяет класс персонажа - то есть символ в этой позиции может соответствовать что-нибудь в классе.

^ в качестве первого символа класса является отрицанием: это означает, что этот класс соответствует любому символу, кроме символов, определенных в этом классе.

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

Таким образом, в некоторых, это будет соответствовать любой строке, которая имеет символы method( следуют любой символ, кроме {.

Есть другие способы, которыми Вы могли бы сделать это вместо:

betelgeuse:tmp james$ grep "method(\w" test* 
test1: method(a,b,c) 
test3: method(a,b,c) 

\w в этом случае (при условии, C локали) эквивалентно [0-9A-Za-z]. Если вы хотите, чтобы дополнительное пространство, вы можете попробовать:

betelgeuse:tmp james$ grep "method([[:alnum:][:space:]]" test* 
test1: method(a,b,c) 
test3: method(a, b, c) 
betelgeuse:tmp james$ 

(в синтаксисе Grep, [:alnum:] is the same as \ ш ; [: пространство:] refers to any whitespace character - this is represented as \ s` в большинстве реализаций регулярных выражений)

1

Вы можете использовать character classes для исключения , следующего за{, например

/method\([^{]/ 
+0

Кроме того, что я прокомментировал в своем собственном ответе, '' '' 'должен быть экранирован в вашем регулярном выражении. –

 Смежные вопросы

  • Нет связанных вопросов^_^