Regex.Split上有两个字符

时间:2014-02-18 13:15:26

标签: c# regex

输入字符串为:name = valu\=e;
我想将其与正则表达式分开:namevalu\=e;

因此,拆分表达式应该在char =上拆分,而不是\的前缀。

我想在名字之后或在值\ = e之前保留空格等。这里不能显示因为SO修剪``。

编辑:输入字符串可以包含许多名称=值对。示例:name=value;name2=value2;

3 个答案:

答案 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 "] + ">>>");

我个人认为这样的代码更容易维护或拆分并在规范更改时进行修改。它为您提供了一个实际的字典,您可以通过它们的键来提取值。 也许有可能写得更短,但我仍然在练习这个。 :)