Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.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#_Regex - Fatal编程技术网

C# 正则表达式问题:直到下一次匹配或文档结束

C# 正则表达式问题:直到下一次匹配或文档结束,c#,regex,C#,Regex,我正在开发一个文档解析器,从我收到的一些文档中提取数据,并用C编写代码。这些文档的格式如下: (Type 1): (potentially multi-lined string) (Type 2): (potentially multi-lined string) (Type 3): (potentially multi-lined string) ... (Type N): (potentially multi-lined string) (Type 1): (potentially mul

我正在开发一个文档解析器,从我收到的一些文档中提取数据,并用C编写代码。这些文档的格式如下:


(Type 1): (potentially multi-lined string)
(Type 2): (potentially multi-lined string)
(Type 3): (potentially multi-lined string)
...
(Type N): (potentially multi-lined string)
(Type 1): (potentially multi-lined string)
...
End Of Document.
文档以相同格式重复类型1-N M次

我在处理多行字符串和查找类型1-N的最后一次迭代时遇到问题

我需要做的是在一个以前面的类型命名的组中捕获潜在的多行字符串

以下是我试图匹配的文档片段:

类型的顺序总是相同的,并且它们的前面总是有一个换行符。 我所拥有的:

Name:\s(?:(?.*?)\r\n)+?Position:\s(?:(?.*?)\r\n)+?Bio:\s(?:(?.*?)\r\n)+?Position History:\s(?:(?.*?)\r\n)+?Notes:\s(?:(?.*?)\r\n)+? 任何帮助都会很好

试试这个:

(?'tag'[\w\s]+):\s*(?'val'.*([\r\n][^:]*)*)
我只是将“:”前面的标签作为命名组“tag”并将其作为可能的多行文本的值进行了挖掘。

试试这个:

(?'tag'[\w\s]+):\s*(?'val'.*([\r\n][^:]*)*)

我只是将“:”前面的标签作为命名组“tag”并将其作为可能的多行文本的值进行了挖掘。

因为您使用的是延迟匹配,最后一个标记只需要它所需要的值。您可以通过在模式末尾添加lookahed来解决此问题,以匹配到下一个标记:

(?=^Name:|$)
下面是完整的正则表达式:

Name:\s(?:(.*?)\s+)Position:\s(?:(.*?)\s+)Bio:\s(?:(.*?)\s+)Position History:\s(?:(.*?)\s+)Notes:\s(?:(.*?)\s+)(?=^Name:|$)

示例:

因为您使用的是惰性匹配,所以最后一个标记只需要它所需要的量。您可以通过在模式末尾添加lookahed来解决此问题,以匹配到下一个标记:

(?=^Name:|$)
下面是完整的正则表达式:

Name:\s(?:(.*?)\s+)Position:\s(?:(.*?)\s+)Bio:\s(?:(.*?)\s+)Position History:\s(?:(.*?)\s+)Notes:\s(?:(.*?)\s+)(?=^Name:|$)

示例:

最简单的修复方法是在从右到左模式下进行匹配:

Regex r = new Regex(@"Name:\s(?:(.*?)\r\n)+?" +
                    @"Position:\s(?:(.*?)\r\n)+?" +
                    @"Bio:\s(?:(.*?)\r\n)+?" +
                    @"Position History:\s(?:(.*?)\r\n)+?" +
                    @"Notes:\s(?:(.*?)\r\n)+?",
                    RegexOptions.Singleline | RegexOptions.RightToLeft);

顺便说一句,我必须删除一堆不合适的问号,才能让它发挥作用。您确实希望捕获这些组,是吗?

最简单的修复方法是以从右到左的模式进行匹配:

Regex r = new Regex(@"Name:\s(?:(.*?)\r\n)+?" +
                    @"Position:\s(?:(.*?)\r\n)+?" +
                    @"Bio:\s(?:(.*?)\r\n)+?" +
                    @"Position History:\s(?:(.*?)\r\n)+?" +
                    @"Notes:\s(?:(.*?)\r\n)+?",
                    RegexOptions.Singleline | RegexOptions.RightToLeft);

顺便说一句,我必须删除一堆不合适的问号,才能让它发挥作用。您确实希望捕获这些组,是吗?

若要添加,则需要重构代码以处理标记的不同值。若要添加,然后,您需要重构代码以处理标记的不同值。这就是我要寻找的:这是最终的工作产品:名称:\s:.*.$\s?+?位置:\s:.*.$\s?+?Bio:\s:.*.$\s?+?位置历史:\s:.*.$\s?+?注意:\s:.*.$\s?+=^Name:\$这是我要找的:这是最终的工作产品:名称:\s:.*?$\s?+?职位:\s:.*?$\s?+?简历:\s:.*?$\s?+?职位历史记录:\s:.*?$\s?+?备注:\s:.*?$\s?+?=^Name:|$