【问题标题】:RegEx for capturing part of a structured string用于捕获部分结构化字符串的正则表达式
【发布时间】:2019-10-09 11:52:52
【问题描述】:

我想从字符串中提取一个子字符串。

top - 16:04:32 up 69 days, 2 min, 0 users, load average: 0.39, 0.39, 0.41|Tasks: 64 total, 1 running, 63 sleeping, 0 stopped, 0 zombie|%Cpu(s): 2.3 us, 11.3 sy, 0.0 ni, 86.3 id, 0.1 wa, 0.0 hi, 0.1 si, 0.0 st|KiB Mem: 511268 total, 171828 used, 339440 free, 71632 buffers|KiB Swap: 0 total, 0 used, 0 free. 67608 cached Mem|

从上面的字符串:我只想要:

|KiB Mem: 511268 total, 171828 used, 339440 free, 71632 buffers| 

模式相同,但数字可能会改变。

KiB\sMem\ 是我一直在尝试的正则表达式。

【问题讨论】:

  • 您要捕获这些数字吗?那里有很多这样的子字符串吗?

标签: regex regex-lookarounds regex-group regex-greedy


【解决方案1】:

在这里,我们想根据我们的字符串和期望的输出使用左右边界,并收集我们喜欢的数据,可能类似于这样的表达式:

(\|KiB.+?buffers\|)

Demo

测试

const regex = /(\|KiB.+?buffers\|)/gm;
const str = `top - 16:04:32 up 69 days, 2 min, 0 users, load average: 0.39, 0.39, 0.41|Tasks: 64 total, 1 running, 63 sleeping, 0 stopped, 0 zombie|%Cpu(s): 2.3 us, 11.3 sy, 0.0 ni, 86.3 id, 0.1 wa, 0.0 hi, 0.1 si, 0.0 st|KiB Mem: 511268 total, 171828 used, 339440 free, 71632 buffers|KiB Swap: 0 total, 0 used, 0 free. 67608 cached Mem|`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

【讨论】:

    【解决方案2】:

    你可以试试这个:

    let str = "top - 16:04:32 up 69 days, 2 min, 0 users, load average: 0.39, 0.39, 0.41|Tasks: 64 total, 1 running, 63 sleeping, 0 stopped, 0 zombie|%Cpu(s): 2.3 us, 11.3 sy, 0.0 ni, 86.3 id, 0.1 wa, 0.0 hi, 0.1 si, 0.0 st|KiB Mem: 511268 total, 171828 used, 339440 free, 71632 buffers|KiB Swap: 0 total, 0 used, 0 free. 67608 cached Mem|";
    
    [match] = str.match(/\|KiB Mem:.+?\|/);
    
    console.log(match);

    正则表达式解释:

    \|KiB Mem:匹配需要以this开头(含)

    .+? 匹配任意字符任意次数,直到找到下面的下一个模式

    \| 匹配文字 |

    【讨论】:

      猜你喜欢
      • 2019-10-12
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 2022-01-12
      相关资源
      最近更新 更多