输入字符串为:name = valu\=e;
我想将其与正则表达式分开:name
和valu\=e;
。
因此,拆分表达式应该在char =
上拆分,而不是\
的前缀。
我想在名字之后或在值\ = e之前保留空格等。这里不能显示因为SO修剪``。
编辑:输入字符串可以包含许多名称=值对。示例:name=value;name2=value2;
。
答案 0 :(得分:2)
您可以使用此模式:
@"(?<!\\)="
(?<!..)
是一个负面的背后断言,意思是:“没有先于”
@"(?<![^\\](?:\\{2})*\\)="
答案 1 :(得分:1)
(?<name>[^=]+)=(?<value>[^;]+;)
然后使用命名组“name”和“value”分别检索每个部分。
e.g:
var matches = System.Text.RegularExpressions.Regex.Matches("myInput", @"(?<name>[^=]+)=(?<value>[^;]+;)");
foreach(Match match in matches)
{
var name = match.Groups["name"];
var value = match.Groups["value"];
doSomething(name, value);
}
编辑:
我不知道你为什么说它不起作用,这是我在LinqPad中使用你在评论中给我的输入得到的:
void Main()
{
var matches = System.Text.RegularExpressions.Regex.Matches(@"zenek=ben\\\;\\ek;juzek=jozek;benek2=true;krowa=-2147483648;du-pa=\\\\\\3/\\\=3\;3\;;", @"(?<name>[^=]+)=(?<value>[^;]+;)");
foreach(Match match in matches)
{
var name = match.Groups["name"].Value;
var value = match.Groups["value"].Value;
("Name: "+name).Dump();
("Value: "+value).Dump();
}
}
结果:
Name: zenek
Value: ben\\\;
Name: \\ek;juzek
Value: jozek;
Name: benek2
Value: true;
Name: krowa
Value: -2147483648;
Name: du-pa
Value: \\\\\\3/\\\=3\;
答案 2 :(得分:1)
您可以使用“常规”代码,而不是使用正则表达式。 :)
string items = "name=value;name2 = valu= = e2";
// Split the list on items.
var itemlist = items.Split(';');
// Split each item after the first '='.
var nameValueArrayList = itemlist.Select(s => s.Split("=".ToCharArray(), 2));
// Convert the list of arrays to a dictionary
var nameValues = nameValueArrayList.ToDictionary(i => i[0], i => i[1]);
MessageBox.Show("<<<" + nameValues["name2 "] + ">>>");
或简而言之:
string items = "name=value;name2 = valu= = e2";
var nameValues = items
.Split(';')
.Select(s => s.Split("=".ToCharArray(), 2))
.ToDictionary(i => i[0], i => i[1]);
MessageBox.Show("<<<" + nameValues["name2 "] + ">>>");
我个人认为这样的代码更容易维护或拆分并在规范更改时进行修改。它为您提供了一个实际的字典,您可以通过它们的键来提取值。 也许有可能写得更短,但我仍然在练习这个。 :)