繁体   English   中英

使用C#正则表达式从字符串中获取多个数据

[英]Using C# regex to get multiple data out of a string

下面是我已经使用了一段时间的日志文件中的一行示例:

5/21/2015 11:55:56 PM | Batch 6|386/767|50.33 %|CH2M-R|Processed NXRMN5...Checking refundable and non-refundable fares. Traditional Booking. Inside ticketing window. Minimum Savings Required: $131.00. Actual Savings: $257.18. Savings found: $257.18 (11.55 %). Savings were previously found.

在此文件中,我需要捕获以下类别:首先是日期和时间,其次是Locator,它是NXRMN5,发现的节省以及此行中的百分比(如果有),为$ 257.18 11.5%。

在控制台中,我希望它看起来像这样:

Date:  5/21/2015 11:55:56 PM 
Locator: NXRMN5
Dollar Savings: $257.18 
Percent Savings: 11.55 %

下面有一些我已经工作了一段时间的代码:

foreach (string line in gdsLines)
        {
            Match m = Regex.Match(line, @"Savings\s+found:\s*\$(?<savings>\d+\.\d+)\s*\(\s*(?<percent>\d+\.\d+)\s*%");
            if (m.Success)
            {
                decimal gdsNumberSavings = decimal.Parse(m.Groups["savings"].Value, CultureInfo.InvariantCulture);
                decimal gdsNumberPercent = decimal.Parse(m.Groups["percent"].Value, CultureInfo.InvariantCulture);

                Console.WriteLine("Dollar Savings: $"  + gdsNumberSavings + " Percent Savings: " + gdsNumberPercent + " % " + "\n");
                gdsTotalSavings += gdsNumberSavings;
                gdsTotalPercentage += gdsNumberPercent;
            }
        } 

我提供的这段代码使用我制作的正则表达式,然后将找到的节省量和百分比都放入,然后在控制台中打印值。 不用担心gdsTotal变量还有其他gdsTotal 主要关注的是正则表达式。 为了添加我需要的其他元素,是否需要创建另一个正则表达式,还是可以在其上添加? 不管哪种方式,有人可以帮助我形成此正则表达式吗? 任何帮助将不胜感激!

让我提出以下解决方案:

  1. 仅用|分割字符串即可提取日期| 并获得第一个元素
  2. 定位器使用正则表达式捕获。

代码如下:

string line = "5/21/2015 11:55:56 PM | Batch 6|386/767|50.33 %|CH2M-R|Processed NXRMN5...Checking refundable and non-refundable fares. Traditional Booking. Inside ticketing window. Minimum Savings Required: $131.00. Actual Savings: $257.18. Savings found: $257.18 (11.55 %). Savings were previously found.";
string date = line.Split('|').Take(1).FirstOrDefault().Trim();
Match m = Regex.Match(line, @"Processed\s+(?<locator>[^.]+)\.{3}.*?Savings\s+found:\s*\$(?<savings>\d+\.\d+)\s*\(\s*(?<percent>\d+\.\d+)\s*%");
if (m.Success)
{
     decimal gdsNumberSavings = decimal.Parse(m.Groups["savings"].Value, CultureInfo.InvariantCulture);
     decimal gdsNumberPercent = decimal.Parse(m.Groups["percent"].Value, CultureInfo.InvariantCulture);
     string locator = m.Groups["locator"].Value;

     Console.WriteLine("Date:  " + date + ", Locator: " + locator + "Dollar Savings: $" + gdsNumberSavings + " Percent Savings: " + gdsNumberPercent + " % " + "\n");
     gdsTotalSavings += gdsNumberSavings;
     gdsTotalPercentage += gdsNumberPercent;
}

输出:

Date:  5/21/2015 11:55:56 PM, Locator: NXRMN5Dollar Savings: $257,18 Percent Savings: 11,55 % 

或者,您可以在单个正则表达式中使用相同的逻辑:

Match m = Regex.Match(line, @"^(?<date>[^|]+)\|.*Processed\s+(?<locator>[^.]+)\.{3}.*?Savings\s+found:\s*\$(?<savings>\d+\.\d+)\s*\(\s*(?<percent>\d+\.\d+)\s*%");

if块中:

string date = m.Groups["date"].Value.Trim();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM