我正在尝试解析具有以下格式的名称(使用 .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*)$
以下是部分解决方案和名称的链接:
答案 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]);
}