У меня есть регулярное выражение:
<[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).