我已经研究了一段时间了,我似乎只是成功地使自己感到困惑,所以任何人都可以提供的帮助将是惊人的。
现在我有一个文本文件,它很大,超过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变量中设置的字符串,或者这是个坏主意?
再次,我有点迷失了,所以任何指针都会很棒。如果需要进一步的信息,请询问:)
答案 0 :(得分:1)
答案 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