簡體   English   中英

幫助撰寫正則表達式

[英]Help to compose regular expression

我有以下字符串: user1 fam <user@example.com>, user2 fam <user2@example.com>, ...

我如何從帶有正則表達式的字符串中獲取郵件地址。 我需要在郵件地址的輸出列表中

user@example.com
uesr2@example.com

我嘗試:

<.*>

但它與<>一起輸出:

   <user@example.com>
   <uesr2@example.com>

謝謝。

ps謝謝@xanatos的評論,我使用Erlang

正如其他人所說,但為了使其更快:

<([^>]*)>

這樣,正則表達式就不必回溯了(建議使用其他正則表達式,正則表達式將匹配所有字符串,然后開始回滾以查找>

由於歷史原因,我還要補充說明之間的細微差別. 和,例如[\\s\\S] 兩者都捕獲\\n所有字符。 第一個( . )找不到它。 因此,通過使用[^>]可以捕獲\\n ,但這對您的工作來說應該不是問題。 http://www.regular-expressions.info/dot.html

只是為了完整起見,因為這是一個經常發生的問題,所以還有另一個變體:

<((?:(?!>).)*)>

(如果需要,可以用[\\s\\S]代替. ,或者,如果您的語言支持,可以使用SingleLine選項,以使.以其他方式運行)。 這里的重點是“停止”表達式可以長於一個字符。 代替(?!>),您可以插入(?!%%) ,它將在%%停止。 但是我不確定這種變體是否可以與Erlang一起使用(我沒有注意到新的Tag ...當我最初閱讀問題並且我不是Erlang程序員時,它就不存在了。而且似乎至少兩位Erlang程序員對參數有不同的看法:-))

使用組。 有關更多詳細信息,請參見regex引擎的文檔。

>>> re.findall('<(.*?)>', 'user1 fam <user@example.com>, user2 fam <user2@example.com>, ...')
['user@example.com', 'user2@example.com']
  • 您需要使用選項ungreedy以便它僅與各個括號對匹配。

  • global以便您可以獲取所有匹配項。

  • 並且您需要{capture, all_but_first, list}以獲取實際值(如果您喜歡二進制結果, list也可以是binary )。 all_but_first告訴re不只返回組的整個匹配(其中包括<> )。

結果:

1> S.
"user1 fam <user@example.com>, user2 fam <user2@example.com>, "
2> re:run(S, "<(.+)>", [ungreedy, global, {capture, all_but_first, list}]).
{match,[["user@example.com"],["user2@example.com"]]}

保持簡單並使用<([^>]*)> ,它盡可能快地運行,並且適用於大多數版本的正則表達式。 這是更快的方法,因為它在使用<(.*?)> 無需回溯, 導致回溯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM