2015-10-15 22 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。它已被禁止。我的大腦現在像一個正則表達式引擎一樣工作:)如果我們保留'(。+?)',那麼'(?!&)'是必需的。這就是我的意思。 –