2013-04-17 108 views
1

我需要一個正則表達式來模糊我擁有的數據庫轉儲文件中的電子郵件。我想用像@fake.com這樣的域名替換所有域名,所以我不會冒險在開發過程中向真人發送電子郵件。電子郵件必須是唯一的以匹配數據庫限制,所以我只想替換域名並保留用戶名。正則表達式來替換電子郵件地址域?

我現在有這樣的正則表達式查找電子郵件

\b[A-Z0-9._%-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b 

如何轉換這個搜索的正則表達式爲正則表達式我可以在查找中使用,並在任何崇高的文本或SED或Vim的替換操作?

編輯:

剛一說明,我才意識到,我可以替代由@[A-Z0-9.-]+\.[A-Z]{2,4}\b在這種情況下找到的所有字符串,但在學術上我仍然有興趣,你可以如何對待電子郵件正則表達式的每個部分作爲令牌並單獨替換用戶名/域。

+0

搜索和查找替換正則表達式之間沒有區別,是嗎?如果你想正確地完成這項工作,你可能想看看[這裏](http://www.regular-expressions.info/email.html)。 –

+0

@ m.buettner,雖然不存在,但是我不需要將電子郵件地址分離出來作爲標記並替換特定的標記,因此我不會替換整個電子郵件地址? –

+0

如果可以假定「@」不出現在其他上下文中,那麼只能搜索域('@ ....')並替換它。您也可以使用捕獲組和反向引用。 – nhahtdh

回答

6

SublimeText

SublimeText使用Boost syntax,它支持的在Perl的正則表達式特性相當大的子集。但是對於這個任務,你並不需要所有這些高級構造。

下面是兩種可能的途徑:

  1. 如果你可以假設@不會出現在其他任何情況下(這是一個相當合理的假設爲普通文本),那麼你可以搜索域名部分@[A-Z0-9.-]+\.[A-Z]{2,4}\b並將其替換。

  2. 如果您使用捕獲組(pattern)和替換字符串中的反向引用。

    查找內容

    \b([A-Z0-9._%-]+)@[A-Z0-9.-]+\.[A-Z]{2,4}\b 
    

    ([A-Z0-9._%-]+)是第一個(也是唯一一個)捕獲的正則表達式組。

    [email protected] 
    

    $1替換指的是由第一捕獲組捕獲的文本。

注意,以上兩種方法,您需要關閉大小寫敏感性(表示爲在左下角的第二個按鈕),除非您特別想刪除只寫在全部大寫電子郵件。

+0

另一種方法是使用* positive lookbehind *來避免捕獲電子郵件的前半部分,並且只針對域。 – plalx

+0

@plalx:因爲模式是可變寬度,所以後視可能無法正常工作。 – nhahtdh

+0

很有意思,我已經實施了與您相同的解決方案,但卻是在四處流竄,無法使其工作。我想這解釋了爲什麼...我會讀更多關於它;) – plalx

1

您可以使用下面的命令Vim的:

:%s/\(\<[A-Za-z0-9._%-]\[email protected]\)[A-Za-z0-9.-]\+\.[A-Za-z]\{2,4}\>/\1fake.com/g 

一切和\)之間\(將變得將由組(\1在這種情況下)的轉義號碼代替的基團。我也修改了正則表達式來匹配小寫字母,並且使用Vim兼容語法。

您也可通過將\c隨時隨地在你的正則表達式這樣的情況下,靈敏度關閉:

:%s/\c\(\<[A-Z0-9._%-]\[email protected]\)[A-Z0-9.-]\+\.[A-Z]\{2,4}\>/\1fake.com/g 

也請注意,%在該行的開頭問的Vim做更換整個文件和g在最後做同一行中的多個替換。

還有一個方法是使用零寬度匹配(\@<=):

:%s/\c\(\<[A-Z0-9._%-]\[email protected]\)\@<=[A-Z0-9.-]\+\.[A-Z]\{2,4}\>/fake.com/g 
+0

vim是否支持'i'國旗?如果是這樣,那麼您不必修改正則表達式來支持區分大小寫。 – nhahtdh

+1

@nhahtdh感謝您的建議。我已經用'\ c'國旗添加了一個版本:) – Alexey

+0

謝謝,你的回答和nhahtdh一樣好,但我最終使用了崇高的改變,所以我給了他答案 –

相關問題