[英]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.