查找出现多次的特定字符串后的数字

时间:2018-11-27 14:52:54

标签: c# regex numbers

我已经研究了一段时间了,我似乎只是成功地使自己感到困惑,所以任何人都可以提供的帮助将是惊人的。

现在我有一个文本文件,它很大,超过10万行。

文本文件如下所示:

The apple is set at Price: £1.00
Sale:  £3.50
Price: £2.00
Plum reduced to Sale:  £2.00
Bananas are usually Price: £4.00
Price: £3.00
Price: £2.00

依此类推...

现在,我想提取所有数字,仅提取字符串“ Price:£”后面的数字(没有£),并暂时在控制台中将其打印出来。

预期输出应为:

1.00
2.00
4.00
3.00
2.00
There were 100,000 lines.

尽管我确信距此有一百万英里,但我还是有以下情况。

int counter = 0;
string line;
string input1 = " Price: £";
string price;

// Read the file and display it line by line.  
System.IO.StreamReader file =
    new System.IO.StreamReader(@"C:Pricelist.txt"); 
while ((line = file.ReadLine()) != null)
{
    price = Regex.Match(input1, @"\d+").Value;
    System.Console.WriteLine(price);
    //System.Console.WriteLine(line);
    counter++;
}

file.Close();
System.Console.WriteLine("There were {0} lines.", counter);
// Suspend the screen.  
System.Console.ReadLine();

我的想法是正则表达式先查找input1字符串,然后找到下一个数字,但它似乎不起作用。我是否需要获取它才能读取line变量中设置的字符串,或者这是个坏主意?

再次,我有点迷失了,所以任何指针都会很棒。如果需要进一步的信息,请询问:)

4 个答案:

答案 0 :(得分:1)

尝试以下正则表达式:Price: £(\d+\.\d+),价格将在第一个捕获的组中。

说明:

  • Price: £-具有必需前缀的文字
  • (\d+\.\d+)-使用小数部分捕获组匹配价格

Demo

答案 1 :(得分:1)

以下正则表达式应该执行您想要的操作:

@"(?<=Price: £).*"

它将正数look behind用于:'Price: £',然后匹配any char any number of times

产生所需的输出。

使用方法

price = Regex.Match(input1, @"(?<=Price: £).*").Value;

答案 2 :(得分:0)

考虑到您在说

  

目前,只需在控制台中将其打印出来即可。

我将价格变量存储在var valueList = new List<string>()中,这样您就可以使用valueList.ForEach(value=> Console.WriteLine(value));,允许您在以后的任何时候使用这些值。

关于自己提取价格:

var prices = line.Split(' ');
var valueList = new List<string>();
prices.ToList().ForEach(p => {
   if (p.StartsWith("£"))
   valueList.Add(p.Substring(1));
   });

之前建议的Regex选项更短,但是有些人更喜欢不使用Regex,因此这是一种无正则表达式的解决方案。

答案 3 :(得分:0)

您的原始代码从不使用string Encrypt(string toEncrypt) { byte[] key = ... byte[] iv = ... using (AesCng aes = new AesCng()) using (ICryptoTransform encryptor = aes.CreateEncryptor(key, iv)) using (MemoryStream memStream = new MemoryStream()) using (CryptoStream cryptoStream = new CryptoStream(memStream, encryptor, CryptoStreamMode.Write,true)) { UTF7Encoding encoder = new UTF7Encoding(); byte[] bytes = encoder.GetBytes(toEncrypt); cryptoStream.Write(bytes, 0, bytes.Length); return Convert.ToBase64String(memStream.ToArray()); } } 变量。这就是必须匹配的内容-而不是line

此外,正则表达式可以在循环外定义一次,并在循环内重复调用。每次调用静态input1方法时,都会创建一个新的Regex实例。这意味着在循环内调用静态Regex方法100,000次将创建100,000个Regex.Replace()实例。

Regex