给出下面的输入字符串集:
(......等等N + 1个案例)
如何构建一个正则表达式,可以识别任意数量的名词这样的短语,并返回每个逗号分隔名词和和连接后面的最终名词作为单独的捕获组?如果不可能,您将使用什么方法来解析和捕获这样的输入?我正在使用C#Regex对象进行解析。
注意,这里的名词只是样本数据(一,二,三,四,五等),逗号后面的空格可能会被省略。此外,名词可能是由空格分隔的多词短语
奖金回合:如果你能够干净地识别同一个表达式中的(一个)和“一个和两个”的非逗号分隔的情况并进行捕获。
答案 0 :(得分:2)
答案 1 :(得分:0)
试试这个。但是,在“两个和三个”形式的最后一场比赛中,我无法获得“,”
(?<word>\w+,* and \w+)|(?<word>(?<=^|,\s?|and )\w+)
答案 2 :(得分:0)
我使用一种简单的方法代替Regex只是为了让代码对其他开发人员来说简单易读。
以下代码显示了使用控制台应用程序的此方法。希望它可以帮到你。
干杯!
class Program
{
static void Main(string[] args)
{
string input = "one, two, three, four, five, thirty one and six";
// Get all nouns into a string array
string [] allNouns = getNouns(input);
// Print the result
foreach (string noun in allNouns)
{
Console.WriteLine(noun);
}
Console.ReadLine();
}
private static string[] getNouns(string input)
{
string[] nouns = input.Split(',');
if (input.ToLower().IndexOf("and") > 0 && nouns.Length > 0)
{
string[] lastTwoNouns = nouns[nouns.Length - 1].Trim().ToLower().Replace("and", "~").Split('~');
Array.Resize(ref nouns, nouns.Length + 1);
nouns[nouns.Length - 2] = lastTwoNouns[0];
nouns[nouns.Length - 1] = lastTwoNouns[1];
}
for (int i = 0; i < nouns.Length; i++)
{
nouns[i] = nouns[i].Trim();
}
return nouns;
}
}