Совпадение только @, а не @@ без негативного взгляда - PullRequest
0 голосов
/ 20 сентября 2018

При использовании JavaScript мне нужно регулярное выражение, которое соответствует любому экземпляру @ {this-format} в любой строке.Моим оригинальным регулярным выражением было следующее:

@{[a-z-]*}

Однако мне также нужен способ "избежать" этих экземпляров.Я хочу, чтобы, если вы добавите лишний @, совпадение было экранировано, например, @@ {this}.

Первоначально я использовал отрицательный вид сзади:

(?<!@)@{[a-z-]*}

И это сработало быпросто отлично, за исключением ... lookbehinds - это функция ECMAScript2018, поддерживаемая только Chrome.

Я читал некоторых людей, предлагающих использовать отрицательный набор символов.Таким образом, мое маленькое регулярное выражение стало таким:

(?:^|[^@])@{[a-z-]*}

... что сработало бы так же хорошо, за исключением того, что не сработало бы, если сложить два из них вместе: @ {foo} @ {bar}

Итак, кто-нибудь знает, как мне этого добиться?Помните, что необходимо выполнить следующие условия:

  • Найти @ {this} в любом месте строки
  • Уметь сбежать как @@ {this}
  • Beв состоянии поставить несколько смежных, например, @ {this} @ {two}
  • Lookbehinds не должны использоваться

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Если вы включите @@ в свой шаблон регулярного выражения в качестве альтернативного варианта сопоставления, он будет использовать @@ вместо того, чтобы разрешить сопоставление для последующего объекта в квадратных скобках.Например:

@@ | (@ {[az -] *})

Затем вы можете оценить объект внутреннего соответствия в javascript. Вот jsfiddle для демонстрации, используя следующий код.

var targetText = '@{foo} in a @{bar} for a @@{foo} and @{foo}@{bar} things.'
var reg = /@@|(@{[a-z-]*})/g;
var result;
while((result = reg.exec(targetText)) !== null) {
        if (result[1] !== undefined) {
        alert(result[1]);
    }
}
0 голосов
/ 20 сентября 2018

Вы можете использовать (?:^|[^@])@, чтобы соответствовать началу паттерна, и захватить следующие @{<sometext>} в группе.Поскольку вы не хотите, чтобы начальный (возможный) [^@] присутствовал в результате, вам придется вручную выполнять итерации совпадений и извлекать группу, содержащую нужную подстроку.Например:

function test(str) {
  const re = /(?=(?:^|[^@])(@{[a-z-]*}))./g;
  let match;
  const matches = [];
  while (match = re.exec(str)) {
    matches.push(match[1]); // extract the captured group
  }
  return matches;
}
console.log(test('@@{this}'))
console.log(test('@{these}@{two}'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...