Самый простой способ вернуть массив групповых совпадений? - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть регулярное выражение:

<[a-z]+>(.{2,}?)<\/

Чтобы извлечь из этой строки

<OperatingSystem>Windows 10 Enterprise 64-bit (10.0, Build 17763) (17763.rs5_release.180914-1434)</OperatingSystem> <Processor>Intel(R) Xeon(R) CPU E3-1270 v3 @ 3.50GHz (8 CPUs), ~3.5GHz</Processor>  <Memory>16384MB RAM</Memory>    <UserDPISettings>96 DPI (100 percent)</UserDPISettings> <CardName>NVIDIA Quadro K2000</CardName>    <DedicatedMemory>2007 MB</DedicatedMemory>  <CurrentMode>1920 x 1200 (32 bit) (59Hz)</CurrentMode>  <NativeMode>1920 x 1200(p) (59.950Hz)</NativeMode>  <DriverVersion>26.21.14.4166</DriverVersion>    <DriverVersion>6.00.0001.6070</DriverVersion>

массив выбранных групп (не полное совпадение, см. разница * 1008) *):

[[Windows 10 Enterprise 64-bit (10.0, Build 17763) (17763.rs5_release.180914-1434), Intel(R) Xeon(R) CPU E3-1270 v3 @ 3.50GHz (8 CPUs), ~3.5GHz, 16384MB RAM, 96 DPI (100 percent), NVIDIA Quadro K2000, 2007 MB, 1920 x 1200 (32 bit) (59Hz), 1920 x 1200(p) (59.950Hz), 26.21.14.4166, 6.00.0001.6070]]

Является ли следующий код самым простым способом сделать это?

  let r = /<[a-z]+>(.{2,}?)<\//gi, out = []; //Extract everything between quotes
  let arr = [...str.matchAll(r)]; 
  out = arr.map(x => x[1]);

Если я выполню следующее, я получу массив полных совпадений:

var out = str.match(r); //["<OperatingSystem>Windows 10 Enterprise 64-bit (10.0, Build 17763) (17763.rs5_release.180914-1434)</", "<Processor>Intel(R) Xeon(R) CPU E3-1270 v3 @ 3.50GHz (8 CPUs), ~3.5GHz</", "<Memory>16384MB RAM</", "<UserDPISettings>96 DPI (100 percent)</", "<CardName>NVIDIA Quadro K2000</", "<DedicatedMemory>2007 MB</", "<CurrentMode>1920 x 1200 (32 bit) (59Hz)</", "<NativeMode>1920 x 1200(p) (59.950Hz)</", "<DriverVersion>26.21.14.4166</", "<DriverVersion>6.00.0001.6070</"]

Есть ли что-то похожее на str.match (r) для непосредственного возврата массива групп?

Спасибо!

Редактировать: Самый простой способ Я обнаружил:

let r = /<[a-z]+>(.{2,}?)<\//gi, out = []; 
let arr= Array.from(str.matchAll(r), m => m[1]);

Еще более простое решение - использовать lookbehinds и lookaheads, чтобы просто выбрать интересующие вас поля, как показано в в этом примере со следующим регулярным выражением :

/(?<=>\b).*?(?=<\/)/gi

Таким образом, вы пропускаете все дополнительные шаги для извлечения совпадений группы и просто получаете массив результатов, которые вы хотите, просто используя str.match (r).

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