列表中的正则表达式多个字符串C#

时间:2018-08-18 16:44:10

标签: c# regex

我的脚本当前有问题。 我只想展示正则表达式的一些部分。

string str = "db_name=Killa db_type=0 db_sync=false db_id=12 db_status=offline|db_name=mcHD db_type=0 db_sync=true db_id=28 db_status=online|db_name=sla db_type=0 db_sync=false db_id=193 db_status=online";
var l = string.Join("|", str);
var reg = Regex.Matches(l, @"db_name=(.+?)\s+db_id=(\d+)\s+db_status=(.+?)").Cast<Match>().Select(a => new
{
    db_name = a.Groups[1].Value,
    db_id = a.Groups[2].Value,
    db_status = a.Groups[3].Value
}).ToList();
foreach (var x in reg)
{
    Console.WriteLine(x.db_name + " " + x.db_id + " " + x.db_status);
}

但是,这并没有给我想要的东西,而是这些数据。

Killa db_type=0 db_sync=false 12 o
mcHD db_type=0 db_sync=true 28 o
sla db_type=0 db_sync=false 193 o

这就是我想要的:

Killa 12 offline
mcHD 28 online
sla 193 online

希望我能得到答复,并感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

您的正则表达式完全按照您的指示进行操作:

@"db_name=(.+?)\s+db_id=(\d+)\s+db_status=(.+?)"

这将占用db_namedb_id之前的所有内容。但是在输入字符串中,您还需要在这两个字段之间设置db_type和db_sync。

如果更改为此正则表达式,则可以按需要运行:

@"db_name=(?<name>.+?)\s+db_type=(?<type>\d+)\s+db_sync=(?<sync>true|false)\sdb_id=(?<id>\d+)\s+db_status=(?<status>[^|]+)"

这还将捕获db_type和db_sync,因此您必须将代码调整为

db_name = a.Groups[1].Value,
db_id = a.Groups[4].Value,
db_status = a.Groups[5].Value

或者,因为我使用了named groups

db_name = a.Groups["name"].Value,
db_id = a.Groups["id"].Value,
db_status = a.Groups["status"].Value

但是。我严重怀疑这是解决潜在问题的正确方法。原始数据来自哪里?为什么要使用正则表达式?

答案 1 :(得分:1)

您可以将正则表达式更改为

db_name=(\w+)[^|]+db_id=(\d+)[^|]+db_status=(\w+)

会得到你想要的

答案 2 :(得分:0)

您可以使用以下解决方案:

var list =
        from z in str.Split('|')
        let x = z.Split(' ')
        let p1 = x[0].Split('=')[1]
        let p2 = x[3].Split('=')[1]
        let p3 = x[4].Split('=')[1]
        select string.Join(' ', p1, p2, p3);