SQL 注释中的 Java 正则表达式查找/替换模式
Posted
技术标签:
【中文标题】SQL 注释中的 Java 正则表达式查找/替换模式【英文标题】:Java Regex find/replace pattern in SQL comments 【发布时间】:2011-12-06 22:02:51 【问题描述】:我只想在 SQL cmets 中查找/替换字符/模式(单行 cmets -- 和块 cmets /* */)。源字符串是一个 SQL 脚本。
目前我正在 cmets 中搜索分号 (;),并希望将其替换为空格。
来源
CREATE OR REPLACE PROCEDURE TESTDBA.PROC_REUSING_BINDED_VAR_N_DSQL
AS
a NUMBER:=2;
b NUMBER:=3; -- jladjfljaf; lakjflajf
-- alksdjflkjaf ladkjf
v_plsql_tx VARCHAR2(2000);
begin
v_plsql_tx := 'BEGIN ' || ' :1 := :1 + :2; ' || 'END;';
execute immediate v_plsql_tx
using in out a, b;
insert into testdba.NEW_TESTING_TABLE(CHARACTER_VALUE) VALUES('a='||a);
end PROC_REUSING_BINDED_VAR_N_DSQL;
-- lajdflajf
/*lakjdfljalfdk; alkdjf*/
/*asdf
;
asdfa*/
/*
adf
asd asdf
*/
你能不能给点建议。
谢谢
【问题讨论】:
【参考方案1】:我会这样做:
try
Pattern regex = Pattern.compile("(?:/\\*[^;]*?\\*/)|(?:--[^;]*?$)", Pattern.DOTALL | Pattern.MULTILINE);
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find())
// matched text: regexMatcher.group()
// match start: regexMatcher.start()
// match end: regexMatcher.end()
catch (PatternSyntaxException ex)
// Syntax error in the regular expression
以上内容将为您提供所有不带“;”的 cmets。然后我会逐行遍历 sql 文件,当我遇到有注释的行时,我会检查该行是否在我的匹配列表中 - 如果不是,那么我会搜索替换;在整个评论中带有“”。当然,您必须找到注释的结束位置,但这很容易——在同一行和 /* 以及找到第一个 */ 时结束。这样您就可以更改任意数量的 ;使用相同的代码。
【讨论】:
这详细解释了我想要什么,并提供了一个解决方案ostermiller.org/findcomment.html。但是这个解决方案有一个很大的性能问题,这里讨论***.com/questions/462843/… 这似乎会捡起像 blah blah 【参考方案2】:你需要先搞清楚:多线cmets有两种处理方式。
-
单个“*/”关闭所有当前打开的“/*”。
对于每个“/*”,您需要一个对应的“*/”(嵌套 cmets)。
第一个相对容易实现。第二个只能通过深度魔术正则表达式(阅读:未来的编码人员无法维护)或短程序来完成。
第一个很简单:只要有嵌入的分号,使用“/\*.*;.*\*/”就会给你一个匹配项。
第二个需要一些编程。如果遇到“;”,则需要检查您当前是否在评论中。您可以通过顺序读取文件(忽略回车/换行)并在遇到“/*”时增加一个数字并在遇到“*/”时减少该数字来知道。如果数字至少为 1,则分号位于注释中。
【讨论】:
【参考方案3】:最好的办法可能是使用两个正则表达式和两个模式(一个单行和一个多行)。
单行:\\-\\-[^;]*(;)
-- 不确定在一行中找到多个 ;
的最佳方法
多行:/\\*[^;(\\*/)]*?(;)[^;]*?\\*/
——反正是这样的
【讨论】:
以上是关于SQL 注释中的 Java 正则表达式查找/替换模式的主要内容,如果未能解决你的问题,请参考以下文章