#javascript
Вопрос:
Я разделяю свою строку и преобразую ее в объект javascript . но мой ключ пропускает это character /*! */
.
вот моя функция строки и разделителя
const a = "/*! ###################################################### # Test.cs # RELEASE: 1.1.1 # BUILD DATE: Fri Oct 30 2020 15:25:57 GMT-0700 (PDT) # COPYRIGHT ###################################################### *//*! MISC SASS */a:focus,button:focus,div[tabindex]:focus,li[tabindex]:focus,span[tabindex]:focus{outline-offset:2px;outline-width:2px!important;outline-style:dotted!important;outline-color:currentColor}/*! GENERIC - BGIMG */.bgimg{background-size:cover;background-position:50% 50%;background-repeat:no-repeat}/*! CG2111 - test */span{color:red}/*! CG2112 - test */span{color:red}/*! INFO */#id{content:'1.1.1'}";
const result = {},
temp = a.split(//*!s*(.*?)s**//).slice(1);
while (temp.length) result[temp.shift()] = temp.shift();
console.log(result);
Мой вывод
{"###################################################### # Test.cs # RELEASE: 1.1.1 # BUILD DATE: Fri Oct 30 2020 15:25:57 GMT-0700 (PDT) # COPYRIGHT ######################################################":"","MISC SASS":"a:focus,button:focus,div[tabindex]:focus,li[tabindex]:focus,span[tabindex]:focus{outline-offset:2px;outline-width:2px!important;outline-style:dotted!important;outline-color:currentColor}","GENERIC - BGIMG":".bgimg{background-size:cover;background-position:50% 50%;background-repeat:no-repeat}","CG2111 - test":"span{color:red}","CG2112 - test":"span{color:red}","INFO":"#id{content:'1.1.1'}"}
Ожидаемый выход
{
"/*! ###################################################### # Test.cs # RELEASE: 1.1.1 # BUILD DATE: Fri Oct 30 2020 15:25:57 GMT-0700 (PDT) # COPYRIGHT ###################################################### */": "",
"/*! MISC SASS */": "a:focus,button:focus,div[tabindex]:focus,li[tabindex]:focus,span[tabindex]:focus{outline-offset:2px;outline-width:2px!important;outline-style:dotted!important;outline-color:currentColor}",
"/*! GENERIC - BGIMG */": ".bgimg{background-size:cover;background-position:50% 50%;background-repeat:no-repeat}",
"/*! CG2111 - test */": "span{color:red}",
"/*! CG2112 - test */": "span{color:red}",
"/*! INFO */": "#id{content:'1.1.1'}"
}
Комментарии:
1. Ваше регулярное выражение можно упростить до
//*!(.*?)*//
. Кажется, что это правильно, чтобы правильно соответствовать требуемым значениям ключей.
Ответ №1:
Все ваши совпадения начинаются с /*!
пробела, за которым следует пробел, поэтому сопоставляйте эти символы до тех пор, пока lookahead не совпадет с тем же /*!
или концом строки.
const a = "/*! ###################################################### # Test.cs # RELEASE: 1.1.1 # BUILD DATE: Fri Oct 30 2020 15:25:57 GMT-0700 (PDT) # COPYRIGHT ###################################################### *//*! MISC SASS */a:focus,button:focus,div[tabindex]:focus,li[tabindex]:focus,span[tabindex]:focus{outline-offset:2px;outline-width:2px!important;outline-style:dotted!important;outline-color:currentColor}/*! GENERIC - BGIMG */.bgimg{background-size:cover;background-position:50% 50%;background-repeat:no-repeat}/*! CG2111 - test */span{color:red}/*! CG2112 - test */span{color:red}/*! INFO */#id{content:'1.1.1'}";
const result = Object.fromEntries(
[...a.matchAll(/(/*! .*?*/)(.*?)(?=/*! |$)/g)]
.map(([, key, value]) => [key, value])
);
console.log(result);
/*!
— сопоставьте буквальное/
значение , за которым следует буквальное*
значение , за которым следует*
.*?
— сопоставьте как можно меньше символов до тех пор, пока(?=/*! |$)
совпадения по внешнему виду/*!
— те же начальные символы, или$
— конец веревки
Комментарии:
1. но это не ожидаемый результат .. Мне нужен объект . не массив
2. О, я скучала по двоеточиям. Струны очень, очень длинные. Используйте
matchAll
вместо этого и захватите ключ и значение отдельно, чтобы вы могли объединить их в объект сObject.fromEntries
Ответ №2:
ES6 ответ:
const a = "/*! ###################################################### # Test.cs # RELEASE: 1.1.1 # BUILD DATE: Fri Oct 30 2020 15:25:57 GMT-0700 (PDT) # COPYRIGHT ###################################################### *//*! MISC SASS */a:focus,button:focus,div[tabindex]:focus,li[tabindex]:focus,span[tabindex]:focus{outline-offset:2px;outline-width:2px!important;outline-style:dotted!important;outline-color:currentColor}/*! GENERIC - BGIMG */.bgimg{background-size:cover;background-position:50% 50%;background-repeat:no-repeat}/*! CG2111 - test */span{color:red}/*! CG2112 - test */span{color:red}/*! INFO */#id{content:'1.1.1'}";
const map = a.split('/*!').slice(1) // break into each item per key-value pair
.map(str => str.split('*/')) // separate key and value
.map(([key, value]) => [`/*!${key}*/`, value]) // add back delimiters
.reduce((map, [key, value]) => ({...map, [key]: value}), {}); // merge into a map
console.log(map);
Выход:
{
"/*! ###################################################### # Test.cs # RELEASE: 1.1.1 # BUILD DATE: Fri Oct 30 2020 15:25:57 GMT-0700 (PDT) # COPYRIGHT ###################################################### */": "",
"/*! MISC SASS */": "a:focus,button:focus,div[tabindex]:focus,li[tabindex]:focus,span[tabindex]:focus{outline-offset:2px;outline-width:2px!important;outline-style:dotted!important;outline-color:currentColor}",
"/*! GENERIC - BGIMG */": ".bgimg{background-size:cover;background-position:50% 50%;background-repeat:no-repeat}",
"/*! CG2111 - test */": "span{color:red}",
"/*! CG2112 - test */": "span{color:red}",
"/*! INFO */": "#id{content:'1.1.1'}"
}