繁体   English   中英

正则表达式拆分为两个字符

[英]Regex.Split on two chars

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

因此,拆分表达式应在不带有\\前缀的char =上拆分。

我想在名称之后或value \\ = e等之前保留空格。由于SO修剪``,所以这里不能显示空格。

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

您可以使用以下模式:

@"(?<!\\)="

(?<!..)是断言后面的断言,它表示:“不以”开头

海因兹的问题很有趣。 如果选择偶数个反斜杠不能转义等号,则必须用以下方式替换模式:

@"(?<![^\\](?:\\{2})*\\)="
(?<name>[^=]+)=(?<value>[^;]+;)

然后使用命名组“名称”和“值”分别检索每个部分。

例如:

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\;

除了使用正则表达式,您还可以使用“常规”代码。 :)

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

我个人认为,当规格更改时,这样的代码更易于维护或拆解和修改。 并且它为您提供了一个实际的字典,您可以通过它们从键中提取值。 也许可以写得更短一些,但我仍在练习。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM