如何使用Regex.split显示指定的字符串?

How can I use Regex.split to display a specified string?

string cmd = "Static hostname: gatewayIcon name: computer - desktopChassis: desktopMachine ID: 706ecaf18cea4c919eb515d0e73c7fe4Boot ID: c2f95d12ab334e57ac7e6503f7d0cd87Operating System: CentOS Linux 8(Core)CPE OS Name: cpe:/ o:centos: centos: 8Kernel: Linux 4.18.0 - 147.3.1.el8_1.x86_64Architecture: x86 - 64Thu Dec 30 15:31:24 EST 2021total used free shared buff / cache availableMem: 7887756 455084 4067136 427084 3365536 6746868Swap: 8183804 0 8183804Filesystem Size Used Avail Use % Mounted ondevtmpfs 3.8G 0 3.8G 0 % / devtmpfs 3.8G 84K 3.8G 1 % / dev / shmtmpfs 3.8G 417M 3.4G 11 % / runtmpfs 3.8G 0 3.8G 0 % / sys / fs / cgroup/ dev / mapper / cl - root 50G 3.2G 47G 7 % // dev / sda2 976M 188M 721M 21 % / boot/ dev / sda1 599M 6.8M 593M 2 % / boot / efi/ dev / mapper / cl - home 53G 12G 42G 22 % / hometmpfs 771M 200K 771M 1 % / run / user / 1000total 120G 15G 105G 13 % -procs---------- - memory------------ - swap------ - io---- - system--------cpu---- -r b swpd free buff cache si so bi bo in cs us sy id wa st2 0 0 4067108 4884 3360652 0 0 0 2 1 3 37 2 61 0 0";
diagtext = cmd;

split = Regex.Split(diagtext, @"%");

foreach (var item in split)
{
   diskmem = split[10];
}

所以我有一个名为 cmd 的长字符串,我使用正则表达式在百分比 %(符号)旁边显示一个特定的字符串。我能够显示此字符串:/ run / user / 1000total 120G 15G 105G 13 %,但我只需要 13 而不是 13.

之前的字符串

我该怎么做?

您可以使用此正则表达式字符串在任何 % 符号之前获取所有百分比计数:

([\d]{1,3})\s%

我不会大声评论,所以我会把我的评论放在这个答案中。 需要更多关于数据结构的信息才能正确回答这个问题,但乍一看,您似乎可以用空格分割这个字符串并获取第 10 项。另一方面,我想知道您为什么使用 foreach 循环。您没有使用 var 项目。

string[] items = diskmem.Split(' ');

split[] 数组的每个索引使用白色 space 分隔符进行另一个拆分,resplit[] 数组的最后一个索引将是 % 符号之前的字符串,直到第一个白色 space 出现:

static void SomeMethod()
{
    string cmd = @"Static hostname: gatewayIcon name: computer - desktopChassis: desktopMachine ID:
                   706ecaf18cea4c919eb515d0e73c7fe4Boot ID: c2f95d12ab334e57ac7e6503f7d0cd87Operating System:
                   CentOS Linux 8(Core)CPE OS Name: cpe:/ o:centos: centos: 8Kernel: Linux 4.18.0 - 147.3.1.el8_1.x86_64Architecture: x86
                   - 64Thu Dec 30 15:31:24 EST 2021total used free shared buff / cache availableMem:
                   7887756 455084 4067136 427084 3365536 6746868Swap: 8183804 0 8183804Filesystem Size
                   Used Avail Use % Mounted ondevtmpfs
                   3.8G 0 3.8G 0 % / devtmpfs 3.8G 84K 3.8G 1 % / dev / shmtmpfs 3.8G 417M 3.4G 11 % / runtmpfs
                   3.8G 0 3.8G 0 % / sys / fs / cgroup/ dev / mapper / cl
                   - root 50G 3.2G 47G 7 % // dev / sda2 976M 188M 721M 21
                   % / boot/ dev / sda1 599M 6.8M 593M 2 % / boot / efi/ dev
                   / mapper / cl - home 53G 12G 42G 22 % / hometmpfs 771M 200K
                   771M 1 % / run / user / 1000total 120G 15G 105G 13
                   % -procs---------- - memory------------ - swap------ - io---- - system--------cpu---- -r b
                   swpd free buff cache si so bi bo in cs us sy id wa st2 0 0 4067108 4884 3360652 0 0 0 2 1 3 37 2 61 0 0";
    diagtext = cmd;    
    split = Regex.Split(diagtext, @"%");    
    var resplit = split[10].Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
    // OUTPUT: '13'
    string finalResult = resplit[resplit.Length - 1];        
}

你遗漏了一些我们可以用来获得一致结果的模式,但假设你解析的字符串是你显示的示例字符串中的倒数第二个,你可以使用 Split 来获取最后一个值倒数第二个 split 字符串的:

//...
var split = Regex.Split(diagtext, @"%"); // your code

var target = split.ElementAt(split.Length - 2).Split(); //split the string
var val = target.ElementAt(target.Length - 2); //isolate the value 13

Live demo

var target = split.ElementAt(split.Length - 2).Split()
    .Where(p => p != string.Empty).ToArray();
//...

如果你想跳过空格。