正则表达式在字符串中查找问题

时间:2011-06-22 13:26:35

标签: c# regex

我有一些这样的字符串,

  

\ r \ n21。你最喜欢的宠物是什么?   名字?\ r \ nA.Cat B.Dog \ r \ nC.Horse   D.Snake \ r \ n22。哪个国家生产   小麦最多?\ r \ n澳大利亚   B.Bhutan \ r \ nC.India D.Canada。

=====================================

现在我必须找到问题以及从字符串到正则表达式的选择。

任何人都可以成功。

我正在为问题解析[1-9][.]。但我有时会合并两个问题。

任何机构都可以提出任何改变。

5 个答案:

答案 0 :(得分:1)

((\d+\..*?\?\\r\\n)(A\..*?)(B\..*?)(C\..*?)(D\..*?\\r\\n))

你可以使用这个正则表达式,但它假设在最后一个选择之后有\ r \ n个字符。

答案 1 :(得分:1)

我创建了两个可能的正则表达式,具体取决于您是否希望问题/答案的数字/字母出现在捕获中。

Pattern1: (?<Question>\d+\.[^?]+\?)(?:(?:\W*)(?<Answer>[ABCD]\..*?(?=$|(?:\s|\r\n)(?:[ABCD]\.|\d+\.))))*
Pattern2: \d+\.(?<Question>[^?]+\?)(?:(?:\W*)[ABCD]\.(?<Answer>.*?(?=$|(?:\s|\r\n)(?:[ABCD]\.|\d+\.))))*

我假设您希望在C#中使用它,因为您将其标记为C#,因此这里有一些示例代码可以粘贴到新的控制台应用程序中以开始播放:

        var input = "\r\n21.what is your favourite pet name?\r\nA.Cat B.Dog\r\nC.Horse D.Snake\r\n22.Which country produce wheat most?\r\nA.Australia B.Bhutan\r\nC.India D.Canada.";
        var pattern1 = @"(?<Question>\d+\.[^?]+\?)(?:(?:\W*)(?<Answer>[ABCD]\..*?(?=$|(?:\s|\r\n)(?:[ABCD]\.|\d+\.))))*";
        var pattern2 = @"\d+\.(?<Question>[^?]+\?)(?:(?:\W*)[ABCD]\.(?<Answer>.*?(?=$|(?:\s|\r\n)(?:[ABCD]\.|\d+\.))))*";
        foreach (Match m in Regex.Matches(input, pattern2))
        {
            var question = m.Groups["Question"].Value;
            var answers = (from Capture cap in m.Groups["Answer"].Captures
                           select cap.Value).ToList();

            Console.WriteLine("Question: {0}", question);
            foreach (var answer in answers)
            {
                Console.WriteLine("Answer: {0}", answer);
            }
        }
        Console.ReadLine();

它使用正则表达式模式将每个问题解析为问题变量,并将相关答案解析为答案列表。您可以通过更改发送到第一个foreach中的Regex.Matches()函数的模式来更改使用的模式。

答案 2 :(得分:0)

在Python中:

找到问题:

>>> import re
>>> re.findall(r'[1-9][1-9]*\.([^?]*)',s)
['what is your favourite pet name', 'Which country produce wheat most']

答案 3 :(得分:0)

这可以提供帮助:

[0-9]+\.(.*?)\?\s*A\.(.*?)\s*B\.(.*?)\s*C\.(.*?)\s*D\.(.*?)\r\n

使用\ r \ n来解决问题不是一个好主意。虽然它适用于你的情况。

答案 4 :(得分:0)

我不确定它是否适用于孟加拉语,但以下代码在英语中运行正常(至少在您提供的示例中);)

var input = "\r\n21.what is your favourite pet name?\r\nA.Cat B.Dog\r\nC.Horse D.Snake\r\n22.Which country produce wheat most?\r\nA.Australia B.Bhutan\r\nC.India D.Canada.";

var regex = new Regex(@"(?<number>[0-9]+)\.(?<question>.+\?)\W+((?<letter>[A-Z])\.(?<answer>\w+)\W*)+");

foreach (Match question in regex.Matches(input))
{
    Console.Write("{0}. ", question.Groups["number"].Captures[0]);
    Console.WriteLine(question.Groups["question"].Captures[0]);

    foreach (Capture answer in question.Groups["answer"].Captures)
    {
        Console.WriteLine(answer.Value);
    }
}

打印:

21. what is your favourite pet name?
Cat
Dog
Horse
Snake
22. Which country produce wheat most?
Australia
Bhutan
India
Canada

我想你可以从那里得到你需要的东西。