我有這樣的正則表達式:爲什麼這個正則表達式捕獲被排除的字符?
(?:(\\s| |\\A|^))(?:@)[A-Za-z0-9]{2,}
我所試圖做的是找到與@開始,經過兩個或多個字符有一個模式,但它不能在一箇中間開始字。
我是新來的正則表達式,但在印象?:匹配,但然後排除字符,但我的正則表達式似乎匹配,但包括字符。理想情況下,我希望「@test」返回「test」和「test @ test」以完全不匹配。
任何人都可以告訴我我做錯了什麼嗎?
謝謝。
我有這樣的正則表達式:爲什麼這個正則表達式捕獲被排除的字符?
(?:(\\s| |\\A|^))(?:@)[A-Za-z0-9]{2,}
我所試圖做的是找到與@開始,經過兩個或多個字符有一個模式,但它不能在一箇中間開始字。
我是新來的正則表達式,但在印象?:匹配,但然後排除字符,但我的正則表達式似乎匹配,但包括字符。理想情況下,我希望「@test」返回「test」和「test @ test」以完全不匹配。
任何人都可以告訴我我做錯了什麼嗎?
謝謝。
試試這個:你可以用字邊界來指定你的條件。
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)..
你的理解是不正確。 (...)
和(?:...)
之間的區別僅在於前者還會創建一個編號的匹配組,該匹配組可以從regex內引用反向引用,或者作爲匹配後的代碼捕獲的匹配組。
您可以更改代碼以使用lookbehinds,但簡單明瞭的修復方法是將([A-Za-z0-9]{2,})
放在正常的括號內,就像我在這裏所做的一樣,並檢索第一個匹配的組。 (該@
不需要周圍沒有任何括號在這種情況下,但你有那些是無害的。)
如何: \ W @ [\ S] {2} [\ S] *
需要修剪此正則表達式捕獲的字符串並刪除第一個字符。
它看起來像你的正則表達式本身很好:http://rubular.com/r/ WWELFh88SY你如何執行它? –
'(?:...)'是一個非捕獲組,它意味着它可以在不創建捕獲組的情況下使用括號(如替代等)。您正在尋找[lookarounds](http://www.regular-expressions.info/lookaround.html)。 – Sam
Lookarounds是我需要的,謝謝你的指針 – crazyfool