C# 使用Regex.Split创建字符串数组

C# 使用Regex.Split创建字符串数组,c#,regex,C#,Regex,好吧,我提前警告你,我对正则表达式的理解非常有限(多年来我尽了最大的努力学习它们,但说实话,我认为它们只是吓坏了我。) 假设我有以下字符串: string keyValues = "CustomerId=1||OrderId=12||UserId=a1dcd568-f129-419b-b51e-be2dbb67de0f" 此字符串表示键值对,由用户定义的字符串(在本例中为| |)分隔(例如key1=value1 | | key2=value2)。我试图从这个字符串中提取密钥并将它们存储在一个数

好吧,我提前警告你,我对正则表达式的理解非常有限(多年来我尽了最大的努力学习它们,但说实话,我认为它们只是吓坏了我。)

假设我有以下字符串:

string keyValues = "CustomerId=1||OrderId=12||UserId=a1dcd568-f129-419b-b51e-be2dbb67de0f"
此字符串表示键值对,由用户定义的字符串(在本例中为
| |
)分隔(例如
key1=value1 | | key2=value2
)。我试图从这个字符串中提取密钥并将它们存储在一个数组中。该阵列将如下所示:

{"CustomerId", "OrderId", "UserId"}
{"", "C", "u", "s", "t", "o", "m", "e", "r", "I", "d", "", "", ...}
我能想到的最好的选择是使用正则表达式(如果有人有更好的解决方案,请分享)。以下是我想做的:

string delimiter = "||";
string[] keys = Regex.Split(keyValues, "=.*" + delimiter);
我可能错了,但按照我的理解,正则表达式应该找到一个以
=
开头,以
分隔符结尾的字符串,中间有任意数量的字符。这将在这些位置拆分字符串,留下原始键,但我的键数组如下所示:

{"CustomerId", "OrderId", "UserId"}
{"", "C", "u", "s", "t", "o", "m", "e", "r", "I", "d", "", "", ...}
如您所见,
=value |
部分被剥离。谁能告诉我我做错了什么

编辑


在我的例子中,分隔符
|
是一个变量。我之所以没有提到这一点,只是因为我认为我可以用
分隔符
替换对
|
的任何引用。从给出的大多数答案中,我现在看到这是一个重要的细节。

在正则表达式中具有特殊意义(
patA | patB
匹配
patA
patB
)。转义
|

使用非贪婪匹配(
*?
):

这将为您提供
{“CustomerId”、“OrderId”、“UserId=a1dcd568-f129-419b-b51e-be2dbb67de0f”}

与前瞻断言匹配更合适:

string delimiter = "||";
string keyValues = "CustomerId=1||OrderId=12||UserId=a1dcd568-f129-419b-b51e-be2dbb67de0f";
string pattern = @"(?<=^|" + Regex.Escape(delimiter) + @")\w+(?==)";
var keys = Regex.Matches(keyValues, pattern);
字符串分隔符=“||”;
string keyValues=“CustomerId=1 | | OrderId=12 | | UserId=a1dcd568-f129-419b-b51e-BE2DB67DE0F”;

字符串模式=@“(?
在正则表达式中具有特殊意义(
patA | patB
匹配
patA
patB
)。Escape

使用非贪婪匹配(
*?
):

这将为您提供
{“CustomerId”、“OrderId”、“UserId=a1dcd568-f129-419b-b51e-be2dbb67de0f”}

与前瞻断言匹配更合适:

string delimiter = "||";
string keyValues = "CustomerId=1||OrderId=12||UserId=a1dcd568-f129-419b-b51e-be2dbb67de0f";
string pattern = @"(?<=^|" + Regex.Escape(delimiter) + @")\w+(?==)";
var keys = Regex.Matches(keyValues, pattern);
字符串分隔符=“||”;
string keyValues=“CustomerId=1 | | OrderId=12 | | UserId=a1dcd568-f129-419b-b51e-BE2DB67DE0F”;

string pattern=@“(?如果您只关心键,为什么不尝试使用匹配而不是使用拆分:

@"[^=|]+(?==)"
如果键不能包含等号
=
或竖条
|
,则上述表达式将匹配一个或多个非
=
|
的字符,这些字符后跟等号
=
,从而匹配键

在C#中:


如果您只关心这些关键点,为什么不尝试使用匹配而不是使用拆分:

@"[^=|]+(?==)"
如果键不能包含等号
=
或竖条
|
,则上述表达式将匹配一个或多个非
=
|
的字符,这些字符后跟等号
=
,从而匹配键

在C#中:

@“=[^ |]*(?:\\\\\\\\\\\\$)上拆分“

如果您需要更多保证,请使用
@“=[^=|]*(?:\\\\\\\\\\\\$)”

编辑为不存在delimeter的消费端。
如果它在C#中,请尝试不使用空白元素。

@=[^ |]*(?:\\\\\\\\\\\\\$)上拆分。

如果您需要更多保证,请使用
@“=[^=|]*(?:\\\\\\\\\\\\$)”

编辑为不存在delimeter的消费端。

如果在C#中使用空元素,请尝试不使用空元素。

另一种方法是不使用正则表达式,因为字符串操作非常基本:

string[] keys =
  keyValues.Split(new string[]{"||"}, StringSplitOptions.None)
  .Select(s => s.Substring(0, s.IndexOf('='))).ToArray();
将正则表达式保留为高级字符串操作。:)


(与使用正则表达式相比,测试此解决方案的性能时,速度大约快40倍。)

另一种方法是在不使用正则表达式的情况下执行此操作,因为字符串操作非常基本:

string[] keys =
  keyValues.Split(new string[]{"||"}, StringSplitOptions.None)
  .Select(s => s.Substring(0, s.IndexOf('='))).ToArray();
将正则表达式保留为高级字符串操作。:)


(与使用正则表达式相比,测试此解决方案的性能时,速度大约快了40倍。)

这两个站点可能对理解正则表达式非常有帮助:@Billy:该页面仅介绍POSIX ERE风格,它非常有限,并且与.NET正则表达式不兼容。使用ActionScript风格,它更兼容,但仍然严重缺乏功能。更有用,微软自己的也很好。@Alan Moore:你完全正确。我也从你分享的网站上获得了很多信息,但这是一大堆信息。我认为一些基本知识的解释会很好:)。这两个站点可能对理解正则表达式非常有帮助:@Billy:该页面只介绍POSIX ERE风格,它非常有限,并且与.NET正则表达式不兼容。使用ActionScript风格,它更兼容,但仍然严重缺乏功能。更有用,微软自己的也很好。@Alan Moore:你完全正确。我也从你分享的网站上获得了很多信息,但这是一大堆信息。我想一些基本的解释会很好:)。