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:你完全正确。我也从你分享的网站上获得了很多信息,但这是一大堆信息。我想一些基本的解释会很好:)。