RegEx для захвата части структурированной строки - PullRequest
1 голос
/ 23 мая 2019

Я хочу извлечь подстроку из строки.

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\ - это регулярное выражение, которое я пробовал.

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Вы можете попробовать это:

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

Regex объяснение:

\|KiB Mem: Матч должен начинаться с этого (включительно)

.+? соответствует любому символу любое количество раз, пока не будет найден следующий шаблон ниже

\| соответствует буквальному |

1 голос
/ 23 мая 2019

Здесь мы хотим использовать левую и правую границу на основе нашей строки и желаемых выходных данных и собирать данные, которые нам нравятся, возможно, выражение, подобное этому:

(\|KiB.+?buffers\|)

Демо

Тест

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}`);
    });
}
...