c#第二次出现char后的Regex子字符串

时间:2011-03-02 09:53:43

标签: c# .net regex

我的问题是我的格式是这样的字符串:

dsadadsadas
dasdasda
dasda
4TOT651.43|0.00|651.43|98933|607.75|0.00|607.75|607.75|7621|14|0|0|799.42
dsda
dasad
das

我需要找到包含 4TOT 的行,并将 socond 第三之间的值子串联'|'任何想法如何在正则表达式子串中获得它? 现在我只有那个:

 var test = Regex.Match(fileContent, "4TOT.*").Value;

找到了整条线。

4 个答案:

答案 0 :(得分:3)

当输入很简单并且遵循这样的严格格式时,我通常更喜欢使用普通旧字符串处理而不是正则表达式。在这种情况下,它为一些简单的代码添加了一些LINQ:

// filter out lines to use
var linesToUse = input
    .Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries)
    .Where(s => s.StartsWith("4TOT"));

foreach (string line in linesToUse)
{
    // pick out the value
    string valueToUse = line.Split('|')[2];

    // more code here, I guess
}

如果您知道输入只包含您感兴趣的一行,则可以删除循环:

string line = input
    .Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries)
    .Where(s => s.StartsWith("4TOT"))
    .FirstOrDefault();

string value = string.IsNullOrEmpty(line) ? string.Empty : line.Split('|')[2];

<强>更新

这种方法在从文件加载输入时效果很好:

foreach (var line in File.ReadLines(@"c:\temp\input.txt")
                         .Where(s => s.StartsWith("4TOT")))
{
    string value = string.IsNullOrEmpty(line) ? string.Empty : line.Split('|')[2];
    Console.WriteLine(value);
}

File.ReadLines是.NET 4中的新增功能,它枚举文件中的行而不将整个文件加载到内存中,而是逐行读取它。如果您使用的是早期版本的.NET,则可以非常轻松地使用自己的方法来提供此行为。

答案 1 :(得分:2)

这个正则表达式怎么样? 似乎对我有用。

4TOT.*?\|.*?\|(.*?)\|

将您要查找的值捕获到一个组中。

答案 2 :(得分:0)

为什么不将字符串拆分两次:首先使用换行符,然后使用'|'符号找到目标子字符串而不使用正则表达式?

var tot = source.Split(Environment.NewLine.ToCharArray())
    .FirstOrDefault(s => s.StartsWith("4TOT"));

if (tot != null)
{
    // gets 651.43
    var result = tot.Split('|')
        .Skip(2)
        .FirstOrDefault();
}

答案 3 :(得分:0)

使用正则表达式:^4TOT(?:(?:[0-9]*(?:.[0-9]*)?)\|){2}([0-9]*(?:.[0-9]*)?).*

此正则表达式将在开头跟4TOT后跟“2个数字(小数点分隔)然后|”两次,并捕获一个数字。其余的被忽略了。

如果您使用:

Match match = Regex.Match(input, pattern);

你会发现anwser进入match.Groups

备注: 数字为[0-9]*\.[0-9]* 使用(?: ... )创建一个非捕获括号