使用正则表达式从c#.net中的字符串中提取选择号

本文关键字:字符串 选择 提取 net 正则表达式 | 更新日期: 2023-09-27 18:20:55

我有一个这样的字符串:

string S = "'nHello and welcom choose one'n response'r'n1:response1'r'n2:choice number 2'r'n3:The Third choice'nin the list'r'n4:You can choose the last response.'n";

它可以更改响应的数量和文本格式,但格式始终为(1:response .... number:response)

我想用正则表达式做一个函数来选择响应。

在这个例子中,我想返回包含单词"last"(4)的数字,如果没有找到响应,则返回0:

int r1 = SomeFunction (S, "last");
int r2 = SomeFunction (S, "bla bla");
Console.Writeline("r1 ---> {0}", r1); // should display r1 ---> 4
Console.Writeline("r2 ---> {0}", r2); // should display r2 ---> 0

使用正则表达式从c#.net中的字符串中提取选择号

我非常怀疑Regex是否是解决这个问题的最实用的方法(可以使用数组)。然而,你来了:

基本上,您创建一个pattern,它将查找任何一位数字,后跟任何文本,后跟您想要的单词(例如"last")。然后捕获该数字(使用变量pattern中的括号)。然后使用match.Groups[1]返回。

using System.IO;
using System;
using System.Text.RegularExpressions;
class Program
{
    static void Main()
    {
        string S = "'nHello and welcom choose one'n response'r'n1:response1'r'n2:choice number 2'r'n3:The Third choice'nin the list'r'n4:You can choose the last response.'n";
        Console.WriteLine(GetNumber (S, "last"));
        Console.WriteLine(GetNumber (S, "bla bla"));
    }
    private static string GetNumber(string inputText, string match)
    {
        string pattern = @".*('d):.*?" + match;
        Regex myRegex = new Regex(pattern, RegexOptions.None);
        foreach (Match myMatch in myRegex.Matches(inputText))
        {
          if (myMatch.Success)
          {
             return myMatch.Groups[1].Value;
          }
        }
        return "0";
    }
}

但是,我重复一遍:你看起来还不知道C#的基本知识,所以已经深入Regex似乎不是一个好主意。

这里有一种稍微不同的方法(混合读取行和正则表达式):

static int FindOption(string options, string name)
{
    using (var reader = new StringReader(options))
    {
        while (true)
        {
            string line = reader.ReadLine();
            if (line == null) break;
            Match match = Regex.Match(line, @"^'s*('d+)'s*:'s*(.*)");
            if (match.Success && match.Groups[2].Value.Contains(name))
            {
                return int.Parse(match.Groups[1].Value);
            }
        }
    }
    return 0;
}

如果你的文本太长,最好这样做。顺便说一下,这个正则表达式有点宽容(注意空格's*)。如果您的文本更加死板,则可能不需要正则表达式。

('d)(?=[^'d]*?last)

你可以试试这个。为单词"last"雇佣一个正面的lookahaead。

请参阅演示。

http://regex101.com/r/oC3nN4/4