我怎样才能找到并获得与正则表达式匹配的价值?

时间:2014-05-21 11:39:25

标签: c# regex

我有以下模式>4.66<我想在字符串中找到。以下代码用于查找模式并为med提供double值:

            string data = File.ReadAllText("test.txt");

            string pattern = "^>\\d.\\d<";

            if (Regex.IsMatch(data, pattern))
            {
                MatchCollection mc = Regex.Matches(data, pattern);

                foreach (Match m in mc)
                {
                    double value = double.Parse(m.Value.Substring(1, m.Value.Length - 1));
                    string foo = "" + 2;
                }
            } 

我认为我的模式是错误的,因为我似乎无法找到&gt; 4.66&lt;我在源头看到它就在那里:D

2 个答案:

答案 0 :(得分:1)

使用以下正则表达式:

(?<=>)\d+\.\d+(?=<)

Regular expression visualization

稍微简化的代码:

string data = File.ReadAllText("test.txt");
MatchCollection mc = Regex.Matches(data, @"(?<=>)\d+\.\d+(?=<)");
foreach (Match m in mc)
{
    double value = double.Parse(m.Value, CultureInfo.InvariantCulture);
}

您不需要调用IsMatch方法,因为Matches只会在没有匹配的情况下返回空集合。

答案 1 :(得分:1)

  1. 主要是,你错过了quantifier。使用\d,您恰好匹配1位数。如果你想匹配更多,你需要定义它。

    +是一个量词,重复前一个项目1或更多。

  2. 要按字面匹配一个点,需要对其进行转义,因为它is a special character in regex

  3. 使用逐字字符串以避免双重转义

  4. 仅将您需要的内容(like Ulugbek described)与lookaround assertions匹配或使用capturing group

  5. 我从您的模式中删除了^,因为这与字符串的开头匹配,并且您写道要在字符串中查找。

  6. 所以我们最终得到:

    string pattern = @">(\d.\d+)<";
    MatchCollection mc = Regex.Matches(data, pattern);
    foreach (Match m in mc)
    {
        double value = double.Parse(m.groups[1]);
    }