2012-06-26 135 views
3

當我試圖找出正則表達式時,我總是頭痛。正則表達式匹配字符串中的電子郵件

我有以下的字符串例子:

3; #[email protected]_LThumb.jpg

2; #[email protected]_LThumb.jpg

我需要從字符串中獲得[email protected]作品。字符串的結尾將始終爲_LThumb.xxx,並且前綴應爲始終爲xxx_membership_

如果有人能想出一些C#正則表達式來幫助我,我將非常感激

+2

爲什麼要使用正則表達式?子串應該解決。 – 2012-06-26 20:50:44

+4

你想處理某人有電子郵件地址[email protected]的情況嗎? – Alan

+0

請參閱「[堆棧溢出不允許標題中的標記](http://meta.stackexchange.com/a/130208)」。 –

回答

4

\w+?_membership_(\S*?)_LThumb.jpg

\w   # Capture a word character 
+   # One or more times 
?   # Lazily (smallest match possible) 
_membership_ # Literal string 
(   # Start capturing group 
\S   # Any character that isn't whitespace 
*   # Zero or more times 
?   # Lazily (smallest match possible) 
)    # End capturing group 
_LThumb.jpg # Literal string 

這包括「應該有」的membership前綴在前面確保我們只從我們的字符串中拉出我們需要的東西。

電子郵件將在比賽的第1組。

You can play with the regex at Regexr

+1

謝謝:)你能分解正則表達式,所以我可以理解它的升技? – kalabo

+0

當然,我會編輯這個問題。 –

+0

''\ w \。@] *'可能需要調整。我會建議這樣的:'\ S *?'這樣做有兩件事:一,它將允許所有有效的電子郵件地址字符匹配,二,它不是一個貪婪的匹配,所以我們得到更好的回溯行爲( '\ w'匹配下劃線的某些口味)。 –

3

正則表達式應該在這種情況下是罰款:使用"_membership_""_LThumb.jpg"爲你的錨,這樣

@"_membership_(.*?)_LThumb.jpg" 

,並得到該得到的錨之間一切的第一個捕獲組。

var email = Regex.Match(
    "2;#[email protected]_LThumb.jpg" 
, @"_membership_(.*?)_LThumb.jpg" 
).Groups[1].ToString(); 

這將打印

[email protected] 
+0

上述兩項工作......爲什麼看起來比另一個更復雜?是因爲任何原因更好的「複雜」嗎? – kalabo

+0

@ user257503「更復雜」版本更具限制性:它確保電子郵件由字母,數字,點和'@'符號組成。 – dasblinkenlight

+0

@ user257503不一定。 dasblinkenlight使用'.',它將匹配任何字符,因爲我只包括字母,句號和@s。他也不打擾'_membership'上的前綴,這幾乎毫無用處,但如果您有很多字符串具有相似但不相同的模式,則可幫助我們縮小結果範圍。 –