2015-10-15 20 views
0

我一直在试图解决一个简单的正则表达式是:正则表达式:是否有可能跳过重复的负向lookbehinds?

  1. 匹配所有字符从线(^)年初至第一&字符到线($)结束。
  2. 比赛不能以&开头。

例子:

  1. test应该匹配test
  2. one&two应匹配one
  3. &test不应该匹配任何东西。

我现在的正则表达式如下:

^(?<!\&)(.+?)(?=\&|$) 

Regex101


目前,此正则表达式失败例子3,在那里,如果我给这个正则表达式&test它匹配&test,但它不应该匹配任何东西。

我认为它可能是与负回顾后(?<!\&)一个问题,&test比赛,因为之前它的字符不是&,但它不占任何以下&字符。

是否正在修改负面后视以考虑重复&可能的字符,如果是这样,我该如何解决这个正则表达式?


(我知道Regex101使用Python的正则表达式,但这个问题的正则表达式的目的是与Java的工作。)

回答

3

您需要使用前瞻而不是向后看,而是懒点与前瞻匹配,使用否定的字符类:

^[^&]+ 

demo(注意\n添加只是一个演示,如果你测试字符串不换行字符,它不会是必要的)。

这里,^断言字符串的开始位置,并[^&]+级比其他的1个或多个字符相匹配&(因此,没有必要使用(?=\&|$)先行,如果需要的话,整条生产线将被匹配) 。

IDEONE demo

public static void main (String[] args) throws java.lang.Exception 
{ 
    System.out.println(fetchMatch("test", 0)); 
    System.out.println(fetchMatch("one&test", 0)); 
    System.out.println(fetchMatch("&test", 0)); 
} 
public static String fetchMatch(String s, int groupId) 
{ 
    Pattern pattern = Pattern.compile("^[^&]+"); 
    Matcher matcher = pattern.matcher(s); 
    if (matcher.find()){ 
     return matcher.group(groupId); 
    } 
    return "ERROR: NOT MATCHED"; 
} 

输出:

test 
one 
ERROR: NOT MATCHED 
+0

啊,负字符类,我怎么会不知道存在这样的事情? – octopod

+0

其实,真@RealSkeptic。它已被禁止。我的大脑现在像一个正则表达式引擎一样工作:)如果我们保留'(。+?)',那么'(?!&)'是必需的。这就是我的意思。 –