如何找到不包含子模式的模式?

时间:2016-08-25 18:35:21

标签: regex netbeans

我正在研究一个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在其应该位置不重复的所有事件?

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组中的值,则使其失败。