шаблон ключевого значения с несколькими критериями с использованием положительного взгляда - PullRequest
1 голос
/ 14 октября 2019

Я пытаюсь отформатировать текст, который содержит пары ключ-значение (у меня есть несколько критериев соответствия). Я пытаюсь с положительным взглядом, как это, но я должен соответствовать точно одно слово как значение

/(?=firstname|lastname)(.*)/gi

поиск текста что-то вроде этого

khjkhkj firstname: 'hello' jlkjkjkl
uhziuuj firstName 'hello' jkljljkkj
ugujgjg firstname='hello' oljkjlkjl
hkhjhkj firstName = 'hello' jljlljj
hjkhjkh firstname = hello jljkkljlk
khjkhkj lastname: 'world' jlkjkjkl
uhziuuj lastname 'world' jkljljkkj
ugujgjg lastName='world' oljkjlkjl
hkhjhkj lastname = 'world' jljlljj
hjkhjkh lastName = world jljkkljlk

1 Ответ

0 голосов
/ 14 октября 2019

Вы можете использовать

/(?:fir|la)stname[\s:=']*([^'\s]*)/gi

См. Демоверсию regex . Значение, которое вам нужно, находится в группе 1. Добавьте при необходимости \b словосочетание до (?:fir|la).

Подробности

  • (?:fir|la) - либоfir или la
  • stname - буквенный текст
  • [\s:=']* - 0 или более пробелов, :, = или '
  • ([^'\s]*) - Захват группы 1: 0 или более символов, отличных от ' и пробелов.

См. Демонстрацию JS:

var s = "khjkhkj firstname: 'hello' jlkjkjkl\nuhziuuj firstName 'hello' jkljljkkj\nugujgjg firstname='hello' oljkjlkjl\nhkhjhkj firstName = 'hello' jljlljj\nhjkhjkh firstname = hello jljkkljlk\nkhjkhkj lastname: 'world' jlkjkjkl\nuhziuuj lastname 'world' jkljljkkj\nugujgjg lastName='world' oljkjlkjl\nhkhjhkj lastname = 'world' jljlljj\nhjkhjkh lastName = world jljkkljlk";
var rx = /(?:fir|la)stname[\s:=']*([^'\s]*)/gi;
var m, res = [];
while (m = rx.exec(s)) {
    res.push(m[1]);
}
console.log(res);

Или, используя matchAll:

const s = "khjkhkj firstname: 'hello' jlkjkjkl\nuhziuuj firstName 'hello' jkljljkkj\nugujgjg firstname='hello' oljkjlkjl\nhkhjhkj firstName = 'hello' jljlljj\nhjkhjkh firstname = hello jljkkljlk\nkhjkhkj lastname: 'world' jlkjkjkl\nuhziuuj lastname 'world' jkljljkkj\nugujgjg lastName='world' oljkjlkjl\nhkhjhkj lastname = 'world' jljlljj\nhjkhjkh lastName = world jljkkljlk";
const rx = /(?:fir|la)stname[\s:=']*([^'\s]*)/gi;
let results = [...s.matchAll(rx)];
console.log(Array.from(results, m => m[1]));

Другой вариант - захватить '...' или строку символов без пробелов после слов и знаков препинания:

var s = "khjkhkj firstname: 'hello' jlkjkjkl\nuhziuuj firstName 'hello' jkljljkkj\nugujgjg firstname='hello' oljkjlkjl\nhkhjhkj firstName = 'hello' jljlljj\nhjkhjkh firstname = hello jljkkljlk\nkhjkhkj lastname: 'world' jlkjkjkl\nuhziuuj lastname 'world' jkljljkkj\nugujgjg lastName='world' oljkjlkjl\nhkhjhkj lastname = 'world' jljlljj\nhjkhjkh lastName = world jljkkljlk";
var rx = /(?:fir|la)stname[=:\s]+('([^']*)'|\S+)/gi;
var m, res = [];
while (m = rx.exec(s)) {
    if (m[2] !== undefined) {
        res.push(m[2]);
    } else {
        res.push(m[1]);
    }
}
console.log(res);

См. это регулярное выражение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...