2014-07-16 61 views
0

我有這樣的正則表達式:爲什麼這個正則表達式捕獲被排除的字符?

(?:(\\s| |\\A|^))(?:@)[A-Za-z0-9]{2,} 

我所試圖做的是找到與@開始,經過兩個或多個字符有一個模式,但它不能在一箇中間開始字。

我是新來的正則表達式,但在印象?:匹配,但然後排除字符,但我的正則表達式似乎匹配,但包括字符。理想情況下,我希望「@test」返回「test」和「test @ test」以完全不匹配。

任何人都可以告訴我我做錯了什麼嗎?

謝謝。

+0

它看起來像你的正則表達式本身很好:http://rubular.com/r/ WWELFh88SY你如何執行它? –

+1

'(?:...)'是一個非捕獲組,它意味着它可以在不創建捕獲組的情況下使用括號(如替代等)。您正在尋找[lookarounds](http://www.regular-expressions.info/lookaround.html)。 – Sam

+0

Lookarounds是我需要的,謝謝你的指針 – crazyfool

回答

0

試試這個:你可以用字邊界來指定你的條件。

public static void main(String[] args) { 
    String s1 = "@test"; 
    String s2 = "[email protected]"; 
    String pattern = "\\[email protected]\\w{2,}\\b"; 
    Pattern p = Pattern.compile(pattern); 
    Matcher m = p.matcher(s1); 
    m.find(); 
    System.out.println(m.group()); 
} 

O/P:

@test

throws `IllegalStateException` in the second case (s2).. 
2

你的理解是不正確。 (...)(?:...)之間的區別僅在於前者還會創建一個編號的匹配組,該匹配組可以從regex內引用反向引用,或者作爲匹配後的代碼捕獲的匹配組。

您可以更改代碼以使用lookbehinds,但簡單明瞭的修復方法是將([A-Za-z0-9]{2,})放在正常的括號內,就像我在這裏所做的一樣,並檢索第一個匹配的組。 (該@不需要周圍沒有任何括號在這種情況下,但你有那些是無害的。)

+0

我實際上已經使用lookarounds解決了這個問題,但是你的答案向我解釋了我做錯了,這就是我接受它的原因:)我的解決方案是(?<=(| \ \ s | \\ A | ^))[@] {1} [A-Za-z0-9] {2,}(可能是一些錯誤或無用的部分,但它做我需要的) – crazyfool

+1

確實,'[@] {1}'更好地寫成'@'(!) – tripleee

0

如何: \ W @ [\ S] {2} [\ S] *

需要修剪此正則表達式捕獲的字符串並刪除第一個字符。

0

我想你最好需要下列之一:

(?<=(?<!\w)@)\w{2,} 

Regular expression visualization

Debuggex Demo

不要忘了逃跑Java中的反斜槓,因爲在一個字符串:

(?<=(?<!\\w)@)\\w{2,} 
相關問題