我想从文本中获取数据。我使用了正则表达式。 我的内容为
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个位置的值?
答案 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)
此表达式将:
注意设置第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}
^ ^
| |
这是有效的,因为通过重复捕获组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