Игнорирование пробелов непосредственно перед персонажем в RegEx - PullRequest
1 голос
/ 09 августа 2010

В качестве упражнения в изучении RegEx на JavaScript я пытался выбрать значение атрибута в таблице стилей CSS.Учитывая следующий CSS:

foo { 
  color: rgb(0, 0, 0)     !important;
  background-color: rgb(0, 0, 0) !important;
  border-left: 1px solid #111; 
}

и функцию getStyle(css, attribute), такую, что getStyle(css, 'background-color') возвращает "rgb(0, 0, 0)", я придумал следующий код:

function getStyle(css, attribute) {
  var pattern = new RegExp(attribute + ':\\s+([^!;]+)');
  return pattern.exec(css);
}

Thisподходит довольно близко: он совпадает, пока не достигнет ! или ;, в зависимости от того, что наступит раньше.Но в случае getStyle(css, 'color') он также возвращает пробел после rgb(0, 0, 0) и до !important:

color = "rgb(0, 0, 0)      "
background-color = "rgb(0, 0, 0) "
border-left =  "1px solid #111"

Я пробовал такие вещи, как attribute + ':\\s+([^\\s+!;]+)', но в итоге возвращается только rgb(0, из-за пробелов в значении.Я также смог получить ожидаемый результат с помощью различных регулярных выражений и заглянуть за спину, но JavaScript их не поддерживает.

Я также подумал, что, возможно, я мог бы указать что-то вроде match в то время как \\s+! или \\s+.+; не соответствует действительности : то есть прекращать сопоставление, как только он находит пробел перед определенным символом, но я не уверен, как ввести это в регулярное выражение.

Я мог бы простотак же легко убрать пробел на втором шаге, но мне интересно: есть ли способ получить ожидаемый результат в одном RegEx?

Ответы [ 2 ]

2 голосов
/ 09 августа 2010

Вам нужно то, что называется прогнозом.Он будет соответствовать тексту, который вы ему дадите, но не включите его в вывод.

pattern = new RegExp(attribute + ':\\s+.+?(?=\\s*[!;])');

(?=...) - это прогноз, где я допускаю пробел и любой из !;.Я использую .+?, чтобы он соответствовал как можно меньшему количеству, прежде чем первая найденная вещь в прогнозном режиме (в противном случае она будет захватывать !important до ;).

1 голос
/ 09 августа 2010

Я бы использовал

'\\s*:\\s*([^\\s+!;]+(?:\\s+[^\\s+!;]+)*)'

Если есть какой-то пробел, за которым следуют другие непробельные / челка / точки с запятой, обрабатывайте его как продолжение значения атрибута.

Я также изменил первую часть, потому что пробел перед и после двоеточия является необязательным.

Возможно, вы также захотите добавить что-то вроде '[\\s;]' + в начало. Как вы понимаете, регулярное выражение color будет соответствовать атрибутам color и background-color.

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