首页 > 解决方案 > 如何使用正则表达式从逗号分隔的字符串中提取潜在的电子邮件地址和间距

问题描述

给定以下字符串(提供前导和尾随引号以突出显示前导/尾随空格):

"  foo@bar.com  , baz@acme, bill@bing.co.uk ,inv liad , thing  "

是否可以使用正则表达式来提取(潜在的)电子邮件地址和分隔它们的字符组?理想情况下,比赛将是:

"  "
"foo@bar.com"
"  , "
"baz@acme"
", "
"bill@bing.co.uk"
", "
"inv liad"
" , "
"thing"
"  "

我希望正则表达式可以利用命名组来区分潜在的电子邮件和电子邮件间的间距。我不想在此步骤中验证电子邮件,也不想使用代码进行拆分和修剪。我需要一份潜在匹配列表及其匹配范围。进一步的步骤将执行验证并将颜色突出显示应用于文本字段。

编辑:了解电子邮件组的位置并不是严格要求,因为我只是验证和突出显示潜在的电子邮件。

我正在使用 Xamarin.iOS,因此可以访问 C# 和 Swift/ObjC RE 引擎。TIA。

标签: regex

解决方案


使用 C#,您可以执行类似的操作

string[] result = Regex.Split(
    "  foo@bar.com  , baz@acme, bill@bing.co.uk ,inv liad , thing  ",
    @"(\b[^,]+\b)"
);

正则表达式匹配任何部分,用您的话来说,是一个潜在的电子邮件地址。在捕获它时拆分它(周围())将匹配的项目插入为单独的元素。

比赛解释:

\b      A word boundary
[^,]+   Any number of, but at least one, characters that isn't a comma.
\b      Another word baoundary

Regex Storm
上 查看它 在ideone上查看它。


编辑

根据评论调整(问题表明职位不是必需的;)与 . 匹配\b[^,]+\b|[ ,]+

在 ideone

输出

(0, 2) |  |
(2, 11) |foo@bar.com|
(13, 4) |  , |
(17, 8) |baz@acme|
(25, 2) |, |
(27, 15) |bill@bing.co.uk|
(42, 2) | ,|
(44, 8) |inv liad|
(52, 3) | , |
(55, 5) |thing|
(60, 2) |  |

使用 JS的插图:

var sInput = '  foo@bar.com  , baz@acme, bill@bing.co.uk ,inv liad , thing  ',
    re = /\b[^,]+\b|[ ,]+/g,
    m;

while ((m = re.exec(sInput)) !== null) {

  console.log(`(${m.index},${re.lastIndex-m.index}) |${m[0]}|`);
}


推荐阅读