2

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

    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 条件,即如果我得到的值是 april 月份(在第 4/nth 位置),那么不做代码

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

4

2 回答 2

1

描述

该表达式将:

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

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

^\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}
                                                      ^                                                            ^
                                                      |                                                            |

在此处输入图像描述

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

例子

显示示例文本中不存在的第四个位置的实时示例,因此匹配失败: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
于 2013-07-19T19:35:30.987 回答
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; }
        }
    }
于 2013-07-16T09:25:36.333 回答