C# 使用正则表达式匹配具有任意分隔符的字段

C# 使用正则表达式匹配具有任意分隔符的字段,c#,regex,C#,Regex,我想这应该是一个老问题,但是,我在论坛上搜索了几个小时后没有找到合适的解决方案 我正在使用C#,我知道可以使用Regex.Split和String.Split方法来实现预期的结果。出于某种原因,我需要使用正则表达式通过指定任意分隔符来匹配所需字段。例如,以下是字符串: #DIV#This#DIV#is#DIV#"A "#DIV#string#DIV# 这里,#DIV#是分隔符,将被拆分为: This is "A " string 如何使用正则表达式匹配这些值 顺便说一下,前导和尾随的#D

我想这应该是一个老问题,但是,我在论坛上搜索了几个小时后没有找到合适的解决方案

我正在使用C#,我知道可以使用
Regex.Split
String.Split
方法来实现预期的结果。出于某种原因,我需要使用正则表达式通过指定任意分隔符来匹配所需字段。例如,以下是字符串:

#DIV#This#DIV#is#DIV#"A  "#DIV#string#DIV#
这里,
#DIV#
是分隔符,将被拆分为:

This
is
"A  "
string
如何使用正则表达式匹配这些值

顺便说一下,前导和尾随的
#DIV#
也可以忽略,例如,下面的源字符串也应该与上面的结果相同:

#DIV#This#DIV#is#DIV#"A  "#DIV#string

This#DIV#is#DIV#"A  "#DIV#string#DIV#

This#DIV#is#DIV#"A  "#DIV#string

您可以使用以下选项进行匹配:

/#?DIV#?/g
并替换为
(空格)

但这有时会给出尾随空格和前导空格。。可以使用

Edit1:如果要匹配字段值,可以使用以下选项:

(?<=(#?DIV#?)|^)[^#]*?(?=(#?DIV#?)|$)
试试这个。抓取捕获或组。参见演示


更新

我想我找到了一种方法(注意这不是有效的!)用正则表达式去除空值

var splits = Regex.Matches(strIn, @"(?<=#DIV#|^)(?:(?!#DIV#).)+?(?=$|#DIV#)");
或者,您可以使用正则表达式匹配所需的字段,然后使用LINQ删除空项:

var spltsTxt2 = Regex.Matches(strIn, @"(?<=#DIV#|^).*?(?=#DIV#|$)").Cast<Match>().Where(p => !string.IsNullOrEmpty(p.Value)).Select(p => p.Value).ToList();

var-spltsTxt2=Regex.Matches(strIn,@)(?…您是否尝试过明显的
“yourstring.Split”(#DIV#))
?如果是这样的话,那为什么对你不起作用呢?这是因为我对应用程序的一般设计。所有解析都来自外部xml文件,我们应用正则表达式引擎来获取所需字段。为什么你不直接应用
Regex.Split
,然后取出片段呢?如果找不到好的解决方案,我会的,但这会的需要对应用程序进行一些修改。不,它只匹配分隔符,而不匹配字段值。它正在关闭,但与字段匹配为:#This,#is,#“a",#string。此模式与源字符串的开头和结尾都没有分隔符也不匹配。太好了!我现在可以获取所有字段。但是,我在开头和结尾还额外获得了两个空匹配项,除了调整表达式外,还有什么方法可以删除它们?我刚刚发现,如果表达式包含“#”字符,则该表达式将丢失字段,例如例如,如果源字符串是:This#DIV#is#DIV#“A#”#DIV#string,其中“A#”应该被提取,但上面的表达式没有得到,有什么建议吗?谢谢!我正在使用.Net正则表达式,它匹配字段和分隔符“#DIV#”。有什么方法删除匹配的分隔符吗?@jones use
match.groups()
对于.net正则表达式,每个匹配有9个匹配项和2个组(一个用于匹配的模式,另一个为空字符串).有什么想法吗?非常感谢。除了开头和结尾的空匹配之外,这个简化表达式非常接近我需要的。我知道应用LINQ过滤这些空匹配非常简单。但是这需要在通用应用程序中添加一些代码。是否可以仅通过正则表达式过滤空匹配我认为这是不可能的,但请尝试
Regex.Matches(strIn,@)(?
var splits = Regex.Matches(strIn, @"(?<=#DIV#|^)(?:(?!#DIV#).)+?(?=$|#DIV#)");
var strIn = "#DIV#This#DIV#is#DIV#\"A # \"#DIV#string#DIV#";
var splitText = strIn.Split(new[] {"#DIV#"}, StringSplitOptions.RemoveEmptyEntries);
var spltsTxt2 = Regex.Matches(strIn, @"(?<=#DIV#|^).*?(?=#DIV#|$)").Cast<Match>().Where(p => !string.IsNullOrEmpty(p.Value)).Select(p => p.Value).ToList();