我的问题是我的格式是这样的字符串:
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;
找到了整条线。
答案 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]*
使用(?: ... )
创建一个非捕获括号