正则表达式 - 使用第一个中间位置解析名称

时间:2016-01-05 18:15:41

标签: c# .net regex

我正在尝试解析具有以下格式的名称(使用 .Net

  

First Last Middle

这是诀窍,第一个中间可选所以:

如果文字是:

  

约翰逊

然后假设姓氏。

如果文字是: 玛丽约翰逊 然后假设为 First(Mary) Last(Johnson)

如果文字是:

  

Mary Johnson Ray Anne

然后假设这是 First(Mary) Last(Johnson) Middle(Ray Anne)

这是我到目前为止所做的:

^(?<first>\s*\S+)\s*(?<last>(\S*\s*)*?)(?<middle>\S*\s*)$

以下是部分解决方案和名称的链接:

RegexStorm.net

3 个答案:

答案 0 :(得分:0)

^(?:(?<first>\w+)\s+)?(?<last>\w+)\s*(?<middle>.*)

答案 1 :(得分:0)

prod <- c('P1','P2','P3')
level <- c('L1','L2','L3')
part <- c('p1','p2','p3','p4','p5')

axis_x <- list(L1 = list('Ordering' = 'id'),
               L2 = list('Ordering' = 'id', 'Part name' = 'part'),
               L3 = list('Ordering' = 'id', 'Part name' = 'part'))

set.seed(123)
test_data <- data.frame(prod = sample(prod,300, replace = T), 
           level = sample(level, 300, replace = T), 
           part = sample(part, 300, replace = T),
           value = rnorm(300))

test_data <- test_data %>% 
        group_by(prod) %>% 
        mutate(id = 1:n()) %>% 
        arrange(prod, id)

这将使他们进入你想要的所有捕获组,但是中间将有一个或多个捕获(第一个是空的,如果没有),具体取决于该人拥有多少个中间名,并且需要在您的代码中加入。

答案 2 :(得分:0)

抱歉原始主义,但为什么不

        private Tuple<string, string, string> Parse(string input)
        {
            if (string.IsNullOrEmpty(input))
                return null;

            var arr = input.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

            if (arr.Length == 1)
            {
                return new Tuple<string, string, string>(null, null, arr[0]);
            }

            if (arr.Length == 2)
            {
                return new Tuple<string, string, string>(arr[0], null, arr[1]);
            }

            return new Tuple<string, string, string>(arr[0], String.Join(" ", arr.Skip(1).Take(arr.Length - 2)), arr[arr.Length - 1]);
        }