У меня есть эта строка в моем цикле:
var regex1 = new RegExp('' + myClass + '[:*].*');
var rule1 = string.match(regex1)
Где "строка" - это строка селекторов классов, например: .hb-border-top:before,.hb-border-left
и "myClass" - это класс: .hb-border-top
Когда я циклически перебираю строки, мне нужно сопоставить строки, в которых есть "myClass", в том числе: before и: hover, но не включая такие вещи, как hb-border-top2
.
Моя идея для этого регулярного выражения состоит в том, чтобы соответствовать hb-border-top
а затем :*
для соответствия ни одному, ни другому столбцу, а затем остальной строке.
Мне нужно сопоставить:
.hb-fill-top::before.hb-fill-top:hover::before.hb-fill-top.hb-fill-top:hover
но вышеприведенные возвраты:
.hb-fill-top::before.hb-fill-top:hover::before.hb-fill-top:hover
и не возвращает .hb-fill-top
.
Таким образом, он должен соответствовать .hb-fill-top
, а затем все, что следует, пока оно начинается :
РЕДАКТИРОВАТЬ:
Рисунок ниже: мои строки - это содержимое {selectorText}. Строка - это либо один класс, либо класс с псевдоэлементом, либо правило с несколькими кланами в нем, разделенное запятыми.
каждая строка, содержащая только .hb-fill-top
ТОЛЬКО или .hb-fill-top:
+ что-то (наведение, после и т.д.). Класс будет в переменной "myClass", поэтому моя проблема, поскольку я не могу быть слишком точной.
Я понимаю, что вы хотите получить любое имя селектора CSS, которое содержит значение где-то внутри, и имеет EITHER :
и 0+ символы до конца строки ИЛИ заканчиваются прямо там.
Затем, чтобы получить совпадения для значения .hb-fill-top
вам нужно решение вроде
/\.hb-fill-top(?::.*)?$/
и следующий JS-код, чтобы все это работало:
var key = ".hb-fill-top";
var rx = RegExp(key.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + "(?::.*)?$");
var ss = ["something.hb-fill-top::before","something2.hb-fill-top:hover::before","something3.hb-fill-top",".hb-fill-top:hover",".hb-fill-top2:hover",".hb-fill-top-2:hover",".hb-fill-top-bg-br"];
var res = ss.filter(x => rx.test(x));
console.log(res);
Обратите внимание, что для .replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
.
это особый метасимвол регулярного выражения, который соответствует любому символу char, но char break. См. Есть ли функция RegExp.escape в Javascript? ,
^
Соответствует началу строки.
(?::.*)?$
будет соответствовать:
(?::.*)?$
- необязательный (из - за последний ?
Квантор, который соответствует 1 или 0 вхождений количественной подмаски) последовательности ((?:...)?
является не-захватом группы) из :
- двоеточие.*
- любые символы 0+, кроме символов разрыва строки$
- конец строки. var regex1 = new RegExp('^\\${myClass}(:{1,2}\\w+)*$')
var passes = [
'.hb-fill-top::before',
'.hb-fill-top:hover::before',
'.hb-fill-top',
'.hb-fill-top:hover',
'.hb-fill-top::before',
'.hb-fill-top:hover::before',
'.hb-fill-top:hover'
];
var fails = ['.hb-fill-top-bg-br'];
var myClass = '.hb-fill-top';
var regex = new RegExp('^\\${myClass}(:{1,2}\\w+)*$');
passes.forEach(p => console.log(regex.test(p)));
console.log('---');
fails.forEach(f => console.log(regex.test(f)));
.hb-fill-top-bg-br
и он должен возвращать только hb-fill-top
и hb-fill-top:[rest of the string]
var regex1 = new RegExp('\\' + myClass + '(?::[^\s]*)?');
var rule1 = string.match(regex1)
Это регулярное выражение выбирает мой класс и когда-нибудь, если он начинается с :
и останавливается, когда он встречает пробельный символ.
См. Регулярное выражение в действии.
Обратите также внимание, что я добавил '\\'
в начале. Это делается для того, чтобы избежать точки в вашем классеName. В противном случае это соответствовало бы чему-то другому, как
ahb-fill-top
.some-other-hb-fill-top
Также будьте осторожны .*
Он может соответствовать чему-то еще после (я не знаю вашего набора строк). Возможно, вы захотите уточнить :{1,2}[\w-()]+
в последней группе. Так:
var regex1 = new RegExp('\\' + myClass + '(?::{1,2}[\w-()]+)?');
.hb-fill-top-rev-bg
и не выбирает остальную часть строки, которая следует после .hb-fill-top:
^
чтобы отметить начало строки здесь:RegExp("^" + key.replace ....
не значит ли это, что строка будет совпадать только если она начинается с "ключа"? Будет ли она работать, если "ключ" где-то в середине строки?