我的脚本当前有问题。 我只想展示正则表达式的一些部分。
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
希望我能得到答复,并感谢您的帮助。
答案 0 :(得分:1)
您的正则表达式完全按照您的指示进行操作:
@"db_name=(.+?)\s+db_id=(\d+)\s+db_status=(.+?)"
这将占用db_name
到db_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);