Java正则表达式负面展望未找到错误的匹配

时间:2015-09-17 14:27:31

标签: java regex

假设我有以下字符串。

create or replace package test as
-- begin null; end;/
end;
/

我想要一个正则表达式,它会在同一行上找到一个前面没有一组"--"双短划线的分号。我正在使用以下模式"(?!--.*);",我仍然在第二行获得两个分号的匹配。

我觉得我错过了一些关于消极情绪的事情,但我无法弄清楚是什么。

3 个答案:

答案 0 :(得分:0)

首先,你需要的是一个负面的后视(?<!),而不是一个负面的预测(?!),因为你想要检查你的潜在匹配背后的内容。

即使这样,你也无法在你的情况下使用负面的lookbehind,因为Java的正则表达式引擎不支持可变长度的lookbehind。这意味着您需要准确了解潜在匹配背后的字符数量才能使其正常工作。

话虽如此,在您的情况下,通过换行/回车分割您的字符串然后删除以“ - ”开头的行会不会更简单吗?

答案 1 :(得分:0)

如果你想在不以var alignMenu = function() { $('#main-menu').css({ 'top': $('body').scrollTop(), 'width': $('#vystuduj-to').width() }) } $(window).scroll(function(){ alignMenu() }); $(window).resize(function(){ alignMenu() }); 开头的行上匹配分号 ,这个正则表达式应该可以解决这个问题:

--

Example

我只从你的正则表达式做了一些改动:

  1. 多行模式,因此我们可以使用^(?!--).*(;)^并按行搜索

  2. 开头的
  3. $表示行的开头

  4. 否定前瞻和分号之间的
  5. ^,因为否则第一次更改会尝试匹配.*之类的内容,这是错误的

  6. (我还在分号周围添加了括号,因此演示页面会更清楚地显示结果,但这不是必需的,您可以更改为最方便的程序。)

答案 2 :(得分:0)

"(?!--.*);"无法正常工作的原因是因为前面的负面展示声明当;位于接下来的两个字符为--之前时,它当然匹配每次(;始终不是--)。

在java中,要匹配在其之前的任何位置没有;的{​​{1}}:

--

要使用"\\G(((?<!--)[^;])*);" 电话查看此操作:

replaceAll()

输出:

String s = "foo; -- begin null; end;";
s = s.replaceAll("\\G(((?<!--)[^;])*);", "$1!");
System.out.println(s);

显示双击之前只有半冒号匹配。