" john smith (idjs) <js@email.com>"

Как мне разбить предыдущее на 3 части?

1: john smith
2: (idjs)
3: <js@email.com>

У меня проблемы с попыткой получить любую из частей:

Пробовал это:

var fullname = Regex.Match(item, $"(?=^).*(?=()").Value;
0
Rod 18 Сен 2021 в 00:43

3 ответа

Лучший ответ

Вы можете использовать именованные сопоставленные группы для этого:

var item = " john smith (idjs) <js@email.com>";
String[] patternArr =
{
    "(?:\\s*)", 
    "(?<fullname>[a-zA-Z\\s]*?[a-zA-Z])", // captures the full name part
    "(?:\\s*)",
    "(?<idjs>\\([a-zA-Z]*\\))", // captures the idjs part
    "(?:.*)",
    "(?<email>(?:<).*@.*(?:>))" // captures the email part
};

var pattern = String.Join("", patternArr);
var m = Regex.Match(item, pattern);

if (m.Success)
{
    Console.WriteLine("fullname: {0}", m.Groups["fullname"]);
    Console.WriteLine("idjs: {0}", m.Groups["idjs"]);
    Console.WriteLine("email: {0}", m.Groups["email"]);
}

Выход:

fullname: john smith
idjs: (idjs)
email: <js@email.com>

Демо: https://dotnetfiddle.net/y6U5j4

3
Kenan Güler 17 Сен 2021 в 22:48
string pattern = 
    @"\s*" +       // zero or more whitespace characters
    @"(.*)" +      // any set of one or more characters
    @"\s+" +       // one or more whitespace characters
    @"(\(.*\))" +  // zero or more characters inside parens
    @"\s" +        // a single whitespace
    @"(<.*>)"      // zero or more characters inside brackets
    ;

Обратите внимание, что Regex.Match().Value не выдаст вам части - только всю строку, если она совпадает. Вам нужен Regex.Match().Groups, который вернет GroupCollection, который вы можете перебирать, чтобы получить детали.

var groups = Regex.Match(item, pattern).Groups;
foreach(var group in groups)
    Console.WriteLine(groups);
1
D Stanley 17 Сен 2021 в 22:38

Хотя это не с использованием Regex, я бы использовал для этого split:

    var input=" john smith (idjs) <js@email.com>";

    var first=input.Split('(');
    var second=first[1].Split(')');

    var name=first[0].Trim();
    var mid=second[0].Trim();
    var email=second[1].Trim();


/*
result:
john smith
idjs
<js@email.com>
*/

0
Mehrdad Dowlatabadi 17 Сен 2021 в 22:26