正则表达式识别C#中的(X,Y,...和Z)?

时间:2014-03-17 01:00:10

标签: c# regex parsing

给出下面的输入字符串集:

  • 一,二,三
  • 一,二,三和四
  • 一,二,三,四和五

(......等等N + 1个案例)

如何构建一个正则表达式,可以识别任意数量的名词这样的短语,并返回每个逗号分隔名词和连接后面的最终名词作为单独的捕获组?如果不可能,您将使用什么方法来解析和捕获这样的输入?我正在使用C#Regex对象进行解析。

注意,这里的名词只是样本数据(一,二,三,四,五等),逗号后面的空格可能会被省略。此外,名词可能是由空格分隔的多词短语

奖金回合:如果你能够干净地识别同一个表达式中的(一个)和“一个和两个”的非逗号分隔的情况并进行捕获。

3 个答案:

答案 0 :(得分:2)

试试这个正则表达式

\b((?!and)\w+)\b

正则表达式演示:http://regex101.com/r/kC5rR2

您还可以在RegexPal

查看结果

enter image description here

答案 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;
        }
    }
相关问题