2013-03-02 3 views
3

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

  • а) Все комбинации с более низкими/прописных некоторого слова
  • б) За исключением за пару некоторых случайных комбинаций.

Я должен обыскать bash через тысячи исходного кода файлов, вхождений промахов-полба переменных.

В частности, слово Я ищу это FrontEnd, который в нашем руководстве кодирования стиля можно записать ровно в 2 способами в зависимости от контекста:

FrontEnd (F and E upper) 
frontend (all lower) 

Так мне нужно «поймать» любые вхождений которые не следуют нашим стандарты кодирования, как:

frontEnd 
FRONTEND 
fRonTenD 

Я читал много учебников по регулярному выражению для этого конкретного примера, и я не могу найти способ сказать «соответствует этому образцу, НО не совпадают, если это именно этот один или другой ».

Я предполагаю, что это будет похоже на попытку сопоставить «любое число между 000000 и 999999, за исключением точно числа 555555 или числа 123456», я полагаю, что логика схожа (конечно, я не завязываю это либо :))

Thnx


Дополнительный комментарий:

Я не могу использовать grep конвейеру grep -v, потому что я мог пропустить линии; например, если я:

grep -i frontend | grep -v FrontEnd | grep -v frontend 

пропустит такую ​​строку:

if(frontEnd.name == 'hello' || FrontEnd.value == 3) 

, потому что второй будет скрывать вхождение всей линии. Поэтому я ищу регулярное выражение для использования с egrep, способным выполнять точный матч, в котором я нуждаюсь.

ответ

1

Вы не сможете сделать это легко с egrep, потому что Безразлично» t поддержка взглядов. Это, наверное, проще всего сделать с помощью Perl.

perl -ne 'print if /(?!frontend|FrontEnd)(?i)frontend/;' 

использовать только трубу текст через stdin

Как это работает:

perl -ne 'print if /(?!frontend|FrontEnd)(?i)frontend/;' 
^  ^^^ ^^^^    ^^The pattern that matches both the correct and incorrect versions. 
|  || |  | | | |     | This switch turns on case insensitive matching for the rest of the regular expression (use (?-i) to turn it off) (perl specific) 
|  || |  | | | | The pattern that match the correct versions. 
|  || |  | | | Negative forward look ahead, ensures that the good stuff won't be matched 
|  || |  | | Begin regular expression match, returns true if match 
|  || |  | Begin if statement, this expression uses perl's reverse if semantics (expression1 if expression2;) 
|  || | Print content of $_, which is piped in by -n flag 
|  || Evaluate perl code from command line 
|  | Wrap code in while (<>) { } takes each line from stdin and puts it in $_ 
| Perl command, love it or hate it. 
+0

Как шарм !!!! Это ТОЧНО, что мне нужно. Thanx OmnipotentEntity. В частности, я использовал его внутри 'find -exec' и передавал' {} 'perl, поэтому он« обнаруживает »эти особенности среди тысяч файлов. –

0

Это действительно должен быть комментарий, но есть ли причина, по которой вы не можете использовать sed? Я что-то вроде

sed 's/frontend/FrontEnd/ig' input.txt 

То есть, конечно, думать, если вы хотите, чтобы исправить девиантные версии ...

+0

Это не будет работать, так как 'frontend' действует так же. – OmnipotentEntity

+0

Есть причина: «хорошая версия» 'FrontEnd' или' frontend' не взаимозаменяема, это зависит от контекста. Таким образом, мы не можем заменить «все случаи плохого написания» на 'FrontEnd' (как это делал' sed'), потому что некоторые должны быть преобразованы в 'FrontEnd', в то время как другие должны читать' frontend'. Мы ищем способ отображать на экране, чтобы вручную выбрать правильную замену. –

+0

Я знаю, но я подумал, что «действительно так» означает, что неважно, как это было написано. О, хорошо, стоило попробовать; На самом деле я просто пытался обойти эту проблему. Может быть, кто-то может превратить этот ответ в комментарий? – jja