Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用c语言用正则表达式剥离文本行#_C#_Regex - Fatal编程技术网

C# 用c语言用正则表达式剥离文本行#

C# 用c语言用正则表达式剥离文本行#,c#,regex,C#,Regex,在下面显示的文本中,我需要提取双引号之间的信息(输入是一个文本文件) 输出应该是, 571EC002A-TD 571GI001-RUN 571GI001-TD 我应该如何在C#中构建我的正则表达式以匹配它并将其保存到文本文件中 在将所有行读入我的代码之前,我是成功的,但是正则表达式给了我一些不需要的值 提前感谢并感谢。一个简单的正则表达式可以是: Regex tagRegex = new Regex(@"Tag\s?=\s?""(.+?)"""); 一个简单的正则表达式可以是: Rege

在下面显示的文本中,我需要提取双引号之间的信息(输入是一个文本文件)

输出应该是,

571EC002A-TD

571GI001-RUN

571GI001-TD
我应该如何在C#中构建我的正则表达式以匹配它并将其保存到文本文件中

在将所有行读入我的代码之前,我是成功的,但是正则表达式给了我一些不需要的值


提前感谢并感谢。

一个简单的正则表达式可以是:

Regex tagRegex = new Regex(@"Tag\s?=\s?""(.+?)""");

一个简单的正则表达式可以是:

Regex tagRegex = new Regex(@"Tag\s?=\s?""(.+?)""");

如果这些字符串总是这样,您可以使用
子字符串来实现更简单的方法:

line.Substring(7, line.Length - 8)

这将为您提供所需的输出。

如果这些字符串总是这样,您可以使用
子字符串来实现更简单的方法:

line.Substring(7, line.Length - 8)

这将为您提供所需的输出。

更新

对于那些询问为什么不使用String.Substring的人:正则表达式相对于字符串操作的最大优势在于,在您实际请求匹配值之前,它们不会生成临时字符串。匹配项和组仅包含源字符串的索引。在处理日志文件时,这可能是一个巨大的优势


可以使用类似正则表达式的正则表达式匹配标记的内容

Tag\s*=\s*"(<tagValue>.*?)"
结果是一个包含所有标记值的IEnumerable。与任何其他IEnumerable一样,您可以使用
ToArray()
ToList()
将其转换为数组或列表

使用循环的等效代码是

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;
}
如果标记名更改,还可以捕获标记名。如果eg标记具有
标记
前缀,则可以使用以下模式:

(?<tagName>tag\w+)\s*=\s*"(<tagValue>.*?)"

Regex.Matches是线程安全的,这意味着您可以创建一个静态Regex对象并重复使用它,甚至只需在调用
SelectMany

更新之前添加
aspallel()
,即可使用PLINQ并行匹配多行

对于那些询问为什么不使用String.Substring的人:正则表达式相对于字符串操作的最大优势在于,在您实际请求匹配值之前,它们不会生成临时字符串。匹配项和组仅包含源字符串的索引。在处理日志文件时,这可能是一个巨大的优势


可以使用类似正则表达式的正则表达式匹配标记的内容

Tag\s*=\s*"(<tagValue>.*?)"
结果是一个包含所有标记值的IEnumerable。与任何其他IEnumerable一样,您可以使用
ToArray()
ToList()
将其转换为数组或列表

使用循环的等效代码是

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;
}
如果标记名更改,还可以捕获标记名。如果eg标记具有
标记
前缀,则可以使用以下模式:

(?<tagName>tag\w+)\s*=\s*"(<tagValue>.*?)"


Regex.Matches是线程安全的,这意味着您可以创建一个静态Regex对象并重复使用它,甚至可以通过在调用
SelectMany

之前添加
aspallel()
来使用PLINQ并行匹配多行代码,这似乎可以通过简单的
Substring
来实现,只有有解析大型日志文件经验的人或使用Splunk进行同样操作的人才允许对此问题进行向下投票。不要否决你不了解的东西哪个正则表达式给了我一些不想要的值?问题中没有正则表达式。@Rakitić,您的字符串应该是
string Tag=“Tag=\”571EC002A-TD\”。此外,该选项已在答案中发布。准确地发布您的注册表的代码,使用简单的
Substring
down投票似乎是可行的,仅允许有解析大型日志文件经验的人或使用Splunk做同样的事。不要否决你不了解的东西哪个正则表达式给了我一些不想要的值?问题中没有正则表达式。@Rakitić,您的字符串应该是
string Tag=“Tag=\”571EC002A-TD\”。此外,该选项已在答案中发布。为什么
+?
?如果字符串在中间出现了一个<代码>“/CODE”,它将停止在那里。虽然这不可能发生。在正则表达式中,你不需要逃避双引号。如果你想创建一个适当的C字符串,你应该同时逃出<代码> \>代码>和<代码> < <代码>,ie >代码>标签'\\\\s\\((+))\ 。最后,你应该解释OP可以通过Match访问内容。GroupsOP写道,他已经尝试了一些正则表达式-因此我假设他熟悉该用法。就像@PanagiotisKanavos所说的,我认为最后一个反斜杠可以删除,你不能因为@而逃避,你不需要逃避正则表达式中的双引号,就像你在括号前已经做的一样。为什么
+?
?如果字符串在中间出现了一个<代码>“/CODE”,它将停止在那里。虽然这不可能发生。在正则表达式中,你不需要逃避双引号。如果你想创建一个适当的C字符串,你应该同时逃出<代码> \>代码>和<代码> < <代码>,ie >代码>标签'\\\\s\\((+))\ 。最后,你应该解释OP可以通过Match访问内容。GroupsOP写道,他已经尝试了一些正则表达式-因此我假设他熟悉该用法。就像@PanagiotisKanavos所说的,我认为最后一个反斜杠可以删除,你不能因为@而逃避,你不需要逃避正则表达式中的双引号,就像你在括号前已经做的那样。你认为
Regex
和LINQ在幕后所做的一切都比生成一个额外的临时字符串要少吗?此外,代码的可读性非常重要,老实说,我认为所有这些选项只是模糊了一个人的意图。@Andrew正如我所解释的,不,它不是。它仅生成最终值,并且仅在请求时生成<如果每行有两个或多个标记,甚至还有一个额外的空间,则代码>子字符串
甚至不起作用。您需要多个字符串拆分。至于可读性,var