我正在研究一个Netbeans项目(Java),我正在检查一切是否正常。我刚刚发现Netbeans中的Find工具支持正则表达式,因此我使用以下Regex来查找正确的代码:
ps\.set.*\(3, c0.get\((.*)\)\);(\n.*){3}.*ps\.set.*\(7, c1.get\(t\).get\(\1\)\);\n.*ps\.addBatch\(\);
^^ ^^
Subpattern 1... ...must also appear here
示例(由上面的Regex匹配):
ps.setString(3, c0.get(fooPattern)); // "fooPattern" here...
ps.setDouble(5, s.get(k));
ps.setDouble(6, 0d);
ps.setLong(7, c1.get(t).get(fooPattern)); // ... must also be here
ps.addBatch();
我需要它来检查子模式1
是否出现在第二个位置。这个正则表达式工作。但是,我需要找到没有发生的所有事件。
示例(我想找到的):
ps.setString(3, c0.get(fooPattern)); // "fooPattern" here...
ps.setDouble(5, s.get(k));
ps.setDouble(6, 0d);
ps.setLong(7, c1.get(t).get(barPattern)); // ... is NOT here
ps.addBatch();
因此,具体问题是:如何修改此正则表达式以查找Subpattern 1
在其应该位置不重复的所有事件?
答案 0 :(得分:2)
使用我已经提到的否定前瞻,只使用消费子模式而不是\1
(在原始正则表达式中消耗文本)。另外,不要忘记要匹配文字点,你需要逃避它。
ps\.set.*\(3, c0\.get\((.*)\)\);(\n.*){3}.*ps\.set.*\(7, c1\.get\(t\)\.get\((?!\1\))[^()]*\)\);\n.*ps\.addBatch\(\);
^^^^^^^^^^^^
请参阅regex demo
(?!\1\))
否定前瞻限制了更通用的[^()]*
模式(匹配除(
和)
以外的零个或多个字符,您可以将其替换为{{1}如果这些0+字符等于捕获到第1组中的值,则使其失败。