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__
您可以使用带有捕获组的正则表达式进行搜索:
(\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 (
使用记事本++:
Search: ALTER TABLE ONLY (\w+)(\s+)ADD CONSTRAINT fk_\w+(.*?)REFERENCES (\w+)
Replace: ALTER TABLE ONLY ADD CONSTRAINT fk__REFERENCES
这匹配整个命令,捕获重要位,并使用纯文本和捕获位的混合以您想要的方式重建命令。
包围捕获作为编号组,$n
将编号组放回。
我有一个包含如下数据的文本文件:
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__
您可以使用带有捕获组的正则表达式进行搜索:
(\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 (
使用记事本++:
Search: ALTER TABLE ONLY (\w+)(\s+)ADD CONSTRAINT fk_\w+(.*?)REFERENCES (\w+)
Replace: ALTER TABLE ONLY ADD CONSTRAINT fk__REFERENCES
这匹配整个命令,捕获重要位,并使用纯文本和捕获位的混合以您想要的方式重建命令。
包围捕获作为编号组,$n
将编号组放回。