RegEx - 如何在大型文本文件中查找和替换单词?

RegEx - How to find and replace words in a large text-file?

我有一个包含如下数据的文本文件:

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);

收件人:

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)

要查找 ONLY 和 nextline 之间的单词,我有:

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

为了在 REFERENCES 和起始括号之间找到单词,我有:

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

所有这些都在 RegEx101.com

进行了测试

取决于您的正则表达式风格:

^(?: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 \n
ADD CONSTRAINT fk__

参见a demo on regex101.com

您可以使用带有捕获组的正则表达式进行搜索:

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

并替换为:

__

解释:

(\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

使用记事本++:

Search: ALTER TABLE ONLY (\w+)(\s+)ADD CONSTRAINT fk_\w+(.*?)REFERENCES (\w+)
Replace: ALTER TABLE ONLY ADD CONSTRAINT fk__REFERENCES 

这匹配整个命令,捕获重要位,并使用纯文本和捕获位的混合以您想要的方式重建命令。

包围捕获作为编号组,$n 将编号组放回。