2016-07-28 12 views
2

У меня есть текстовый файл с данными, такими как:RegEx - Как найти и заменить слова в большом текстовом файле?

ALTER TABLE ONLY document_labels 
ADD CONSTRAINT fk_g71qgs6l2ufr3170u44j5fpk3 FOREIGN KEY (label_id) REFERENCES application_value(id); 
ALTER TABLE ONLY rule_group_functionality_mapping 
ADD CONSTRAINT fk_g8twyunj9bm096sqywdi8rcx8 FOREIGN KEY (rule_group) REFERENCES application_value(id); 
ALTER TABLE ONLY time_track 
ADD CONSTRAINT fk_gmpyguqbpm1ndjjsxvt03wq4g FOREIGN KEY (user_id) REFERENCES user_account(user_id); 

Я хочу, чтобы заменить все слова, которые, как

fk_<some gibberish> 

с

fk_<word between ONLY and nextline>_<word between REFERENCES and starting brace> 

К примеру, изменения:

ALTER TABLE ONLY document_labels 
ADD CONSTRAINT fk_g71qgs6l2ufr3170u44j5fpk3 FOREIGN KEY (label_id) 
REFERENCES application_value(id); 

To:

ALTER TABLE ONLY document_labels 
ADD CONSTRAINT fk_document_labels_application_value FOREIGN KEY (label_id) 
REFERENCES application_value(id); 

До сих пор, я могу по отдельности искать слова, которые мне нужны, но не смог выполнить замену.

Чтобы найти fk_someGibberish в тексте я делаю:

(?s)(?<=fk_)(.*?)(?= FOREIGN KEY) 

Чтобы найти слово между ТОЛЬКО и nextline у ​​меня есть:

(?s)(?<=ONLY)(.*?)(?=\n) 

и найти слово между ссылками и начиная скобку у меня есть:

(?s)(?<=REFERENCES)(.*?)(?=\() 

Все они были проверены на RegEx101.com

+0

Какой инструмент/программа вы используете? –

+1

Я думаю, вы связались с неправильной скрипкой regex101. – trincot

+0

Я попробовал это с помощью онлайн-инструмента regex101 (ссылка размещена). Но это не имеет большого значения, если он в сети. У меня есть TextMate и Sublime Text на моем Mac, если это помогает. Спасибо – EMM

ответ

3

Вы можете осуществлять поиск с помощью этого регулярного выражения с захватом группы:

(\bONLY\h+)(.+)(\R.*?fk)_\S+(.+?\bREFERENCES\h+)([^(]+) 

и замена с использованием:

$1$2$3_$2_$5$4$5 

Объяснение:

(\bONLY\h+)   # match & capture ONLY followed by 1 or more horizontal spaces 
(.+)     # match & capture till end of line 
(\R.*?fk)   # match & capture newline followed by any text upto fk 
_\S+     # match underscore followed by 1 or more non-whitespace chars 
(.+?\bREFERENCES\h+) # match & capture any text followed by REFERENCES and 1+ spaces 
([^(]+)    # match & capture upto next (

RegEx Demo

+0

Не могли бы вы также объяснить свой ответ немного, поскольку у меня очень ограниченное знание RegEx? – EMM

+0

Добавлено объяснение. Я также предлагаю посмотреть на демонстрационную ссылку для большей ясности. – anubhava

+0

Могу ли я также спросить, как вы разделили демонстрационную ссылку? Всякий раз, когда я использую его, он предоставляет страницу по умолчанию. – EMM

1

В зависимости от вашего вкуса регулярных выражений:

^(?:ALTER\ TABLE\ ONLY\)  # match ALTER TABLE ONLY 
([^\n\r]+)[\n\r]     # capture anything not a newline 
(?:ADD\ CONSTRAINT\)   # match ADD CONSTRAINT 
fk_\S+(?=.*REFERENCES\ ([^()]+)) # match fk_, followed by not a whitespace 
           # pos. lookahead capturing anything after REFERENCES 

надо заменить:

ALTER TABLE $1\n 
ADD CONSTRAINT fk_$1_$2 

См a demo on regex101.com.

+0

Не могли бы вы также объяснить свой ответ немного, поскольку у меня очень ограниченное знание RegEx? – EMM

+0

@EMM: см. Обновленный ответ. – Jan

+0

Спасибо за помощь. Вы заслуживаете upvote :) – EMM

1

Использования Notepad ++:

Search: ALTER TABLE ONLY (\w+)(\s+)ADD CONSTRAINT fk_\w+(.*?)REFERENCES (\w+) 
Replace: ALTER TABLE ONLY $1$2ADD CONSTRAINT fk_$1_$4$3REFERENCES $4 

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

Брекетинг захватывает как пронумерованную группу, а $n помещает эту пронумерованную группу назад.

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

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