Как я могу использовать RegEx для извлечения потенциальных адресов электронной почты и пробелов из строки через запятую - PullRequest
0 голосов
/ 27 марта 2019

С учетом следующей строки (ведущие и конечные кавычки предназначены для выделения начальных / конечных пробелов):

"  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.ТИА.

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Используя 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]}|`);
}
0 голосов
/ 27 марта 2019

Итак, (относительно) простое чередование с негативным прогнозом и явным захватом потенциальной электронной почты в c # может выглядеть так:

using System.Text.RegularExpressions;
string text = "  foo@bar.com  , baz@acme, bill@bing.co.uk ,inv liad , thing , ";
RegexOptions options = RegexOptions.IgnorePatternWhitespace | RegexOptions.ExplicitCapture;

string pattern = @"
    # Match space at the start of the line, at the end, and around commas
    ^\s+ | \s*,\s* | \s+$

    # ...Or...
    |

    # Match anything not followed by a space-surounded comma
    (?<email>
        ((?!
            \s*,\s* | \s+$
        ).)
    *)";

MatchCollection matches = Regex.Matches(text, pattern, options);

foreach (Match m in matches) {
    if (!string.IsNullOrEmpty(m.Groups["email"].Value)) {
        Console.WriteLine($"({m.Index}, {m.Length}) |{m.Value}|");
    }
}

Выход:

(2, 11) |foo@bar.com|
(17, 8) |baz@acme|
(27, 15) |bill@bing.co.uk|
(44, 8) |inv liad|
(55, 5) |thing|
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...