【问题标题】:Regular expression to recognize (X, Y, ... and Z) in C#?在 C# 中识别 (X, Y, ... 和 Z) 的正则表达式?
【发布时间】:2014-03-17 01:00:10
【问题描述】:

给定下面的一组输入字符串:

  • 一、二、三
  • 一、二、三、四
  • 一二三四五

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

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

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

奖励回合:如果您还可以清楚地识别(例如)“一”和“一和二”的非逗号分隔的情况,并在同一表达式中捕获。

【问题讨论】:

  • 一定要用RegEx吗?我相信这可以通过string.Split() 轻松完成。
  • 是的。拆分并修剪每个条目。

标签: c# regex parsing


【解决方案1】:

试试这个正则表达式

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

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

您也可以在RegexPal查看结果

【讨论】:

  • 您的正则表达式似乎在 nouns might be multi-word phrases separated by spaces 要求上失败
  • @PeterM:感谢指出错误。我会尽快更新的:)
【解决方案2】:

试试这个。但是我无法在“二和三”形式的最终比赛中使用“,”

(?<word>\w+,* and \w+)|(?<word>(?<=^|,\s?|and )\w+)

【讨论】:

    【解决方案3】:

    我会使用简单的方法而不是正则表达式,只是为了让代码简单易读。

    以下代码使用控制台应用程序向您展示了此方法的实际效果。希望对你有帮助。

    干杯!

    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;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      • 2018-10-22
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      相关资源
      最近更新 更多