如何编写正则表达式以获取第n个位置的值

时间:2013-07-16 08:56:53

标签: regex

我想从文本中获取数据。我使用了正则表达式。 我的内容为

    2013
        Jan        Feb         March     April    May    June
       34,101.2  12,342.7    12,451.5
Value

我的正则表达式

2013.*?\s*(\d{1,3}([,]\d{3})*|\d{1,3})\.\d{1,})\s*Value

这里我得到的值是“12,451.5”。现在我想使用If条件,即如果我获得的值是4月份的月份(在第4个/第n个位置),则执行其他代码

那么如何获得第n个位置的值?

2 个答案:

答案 0 :(得分:1)

你可以这样做。创建一个模型并将文本填入列表,然后非常直接。

class Program
    {
        static void Main(string[] args)
        {
            Regex reg = new Regex("");

            List<Model> list = new List<Model>(); //list is filled up with your items, use a streamreader if its comma delimited etc
            list.Add(new Model {Month = "Jan", Value = "2"});
            list.Add(new Model { Month = "Feb", Value = "2" });
            list.Add(new Model { Month = "Mar", Value = "3" });
            list.Add(new Model { Month = "Apr", Value = "3" });
            list.Add(new Model { Month = "May", Value = "4" });
            list.Add(new Model { Month = "Jun", Value = "2" });


            for (int i=0; i < list.Count; i++)
            {
                if(reg.IsMatch(list[i].Value)){
                    if (list[i].Value == list[3].Value)
                    {
                        Console.WriteLine(list[i].Month +" "+ "Match april");
                    }
                }
            }

            Console.ReadLine();
        }

        public class Model
        {
            public string Month { get; set; }
            public string Value { get; set; }
        }
    }

答案 1 :(得分:1)

描述

此表达式将:

  • 找到2013年
  • 捕获第n个位置的列标题
  • 捕获下一行第n个位置的值

注意设置第n个位置,您需要将两个指示的数字更改为所需的n值。此处显示的表达式将捕获第3个位置。

^\s*2013[^\r\n]*[\r\n]+(?:\s+([a-z]+)(?=[\r\n\s]|\Z)){3}[^\r\n]*?[\r\n]+(?:[^\r\n0-9,.]+([0-9,.]+)(?=[\r\n\s]|\Z)){3}
                                                      ^                                                            ^
                                                      |                                                            |

enter image description here

这是有效的,因为通过重复捕获组n次正则表达式引擎只会记住上次成功匹配。在你的例程中,你只需测试返回的数组,看看第二次捕获是否有值然后使用那个

实施例

显示示例文本中不存在的第4个位置的实例,因此匹配失败:http://www.rubular.com/r/GUw7yLfLrQ

显示已成功找到的3个位置的实例:http://www.rubular.com/r/h8Y9fKK33c

示例文字

    2013
        Jan        Feb         March     April    May    June
       34,101.2  12,342.7    12,451.5
Value

<强>代码

您没有指定语言,因此我在这里使用PHP来简单地显示表达式的工作原理

<?php
$sourcestring="your source string";
preg_match('/^\s*2013[^\r\n]*[\r\n]+(?:\s+([a-z]+)(?=[\r\n\s]|\Z)){3}[^\r\n]*?[\r\n]+(?:[^\r\n0-9,.]+([0-9,.]+)(?=[\r\n\s]|\Z)){3}/imsx',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>

<强>匹配

[0] =>         2013
        Jan        Feb         March     April    May    June
       34,101.2  12,342.7    12,451.5
[1] => March
[2] => 12,451.5