在下面显示的文本中,我需要在双引号之间提取信息(输入是文本文件)
Tag = "571EC002A-TD"
Tag = "571GI001-RUN"
Tag = "571GI001-TD"
输出应为,
571EC002A-TD
571GI001-RUN
571GI001-TD
我应该如何在C#中构建我的正则表达式以匹配它并将其保存到文本文件中。
我成功读到我的代码中的所有行,但正则表达式给了我一些不良值。
提前感谢和欣赏。
答案 0 :(得分:2)
答案 1 :(得分:1)
<强>更新强>
对于那些问为什么不使用String.Substring的人:正则表达式相对于字符串操作的巨大优势在于它们不会生成临时字符串,而是实际上要求匹配的值。匹配项和组仅包含源字符串的索引。在处理日志文件时,此甘蔗是巨大的优势。
您可以使用正则表达式
匹配标记的内容Tag\s*=\s*"(<tagValue>.*?)"
?
中的.*?
会导致非贪婪的搜索,即只提取第一个双引号的文本。否则,模式将匹配最后一个双引号的所有内容。
(<tagValue>.*?)
定义了一个命名组。这样您就可以引用名称捕获的实际值,甚至可以使用LINQ来处理值
转义后生成的C#代码可能如下所示:
var myRegex=new Regex("Tag\\s*=\\s*\"(<tagValue>.*?)\"");
...
var tags=myRegex.Matches(someText)
.OfType<Match>()
.Select(match=>match.Groups["tagValue"].Value);
结果是包含所有标记值的IEnumerable。您可以使用ToArray()
或ToList()
将其转换为数组或列表,就像任何其他IEnumerable一样
使用循环的等效代码是
var myRegex=new Regex("Tag\\s*=\\s*\"(<tagValue>.*?)\"");
...
List<string> tagValues=new List<string>();
foreach(Match m in myRegex.Matches(someText))
{
tagValues.Add(m.Groups["tagValue"].Value;
}
LINQ版本可以很容易地扩展。例如,File.ReadLines
返回一个IEnumerable,并且不会等到在返回之前加载内存中的所有内容。你可以这样写:
var tags=File.ReadLines(myBigLog)
.SelectMany(line=>myRegex.Matches(line))
.OfType<Match>()
.Select(match=>match.Groups["tagValue"].Value);
如果标签名称已更改,您还可以捕获标签名称。如果例如标签具有tag
前缀,则可以使用以下模式:
(?<tagName>tag\w+)\s*=\s*"(<tagValue>.*?)"
并在Select
函数中提取标记名称和值,例如:
.Select(match=>new {
TagName=match.Groups["tagName"].Value,
Value=match.Groups["tagValue"].Value
});
Regex.Matches是线程安全的,这意味着您可以创建一个静态Regex对象并重复使用它,甚至可以使用PLINQ并行匹配多个行,只需在调用AsParallel()
之前添加SelectMany
即可
答案 2 :(得分:-1)
如果这些字符串总是就是这样,那么只需使用Substring
即可采用更简单的方法:
line.Substring(7, line.Length - 8)
这将为您提供所需的输出。