2017-01-18 4 views
2

Учитывая строку в JavaScript, какJavascript Regex - Захват только Неэкранированные Patterns

{включают} что-нибудь в {фигурные скобки}, но не тогда, когда они убежали как {это} и работы для любой позиции { скобка}

Я хочу, чтобы получить

  • включают
  • фигурные скобки
  • скобка

Я пытался найти способ, но без взгляда позади меня в тупик.

Главное, чтобы НЕ получить экранированный {} контент. Я был бы в порядке с чем-то, что включало бы фигурные скобки в матчах, если это необходимо.

, к сожалению, все, что мне удалось до сих пор это выражение как этот

(?:[^//]){.*?} 

Но это не соответствует, если {находится в начале целевого текста.

Может ли кто-нибудь мне помочь? Благодарю.

+0

ли отделался '' \ '' или '/'? –

+0

Извините - туманный побег. Обновили – Toby

+0

Итак, это еще '/'? :) Если нет, вам нужно будет использовать '' \\ '' в предлагаемом regex, а не '\ /'. –

ответ

5

Я предполагаю, что побег char /.

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

/(?:^|[^\/]){([^}]*)}/g 
      ^^^^^^^ 

Смотрите regex demo

Деталь:

  • (?:^|[^\/]) - либо начало нить или символ, отличный от /
  • { - буквальный {
  • ([^}]*) - Группа 1 захватывая любые 0+, кроме } символов (добавить { в класс, чтобы соответствовать кратчайшее окно между { и })
  • } - буквальное }.

var rx = /(?:^|[^\/]){([^}]*)}/g; 
 
var str = "{include} anything in {curly braces} but not when they are escaped like /{this} and work for any position of the {brace}"; 
 
var m, res = []; 
 
while ((m = rx.exec(str)) !== null) { 
 
    res.push(m[1]); 
 
} 
 
console.log(res);

+0

Если у вас есть '' '' 'как escape-символ, вам нужно изменить' [^ \ /] 'на' [^ \\] '. –

+0

Спасибо, Виктор. Это, безусловно, будет работать для меня. Я могу запустить некоторый код, чтобы обрезать вывод. Я не очень силен в регулярном выражении Javascript, но из интереса, в чем разница между вашим путем и просто этим? ([^ \ /] | ^) {. *?} На самом деле, я действительно не получаю влияние?: Или почему ([^}] *), а не просто. *? - Я догадываюсь, что чего-то не хватает Мне интересно узнать. Спасибо. – Toby

+1

'{. *?}' Будет соответствовать символам '' '' '' '' '' '' + '', отличным от символов разрыва строки, как можно меньше до первого '}' (так что он будет соответствовать строкам, которые находятся на одной строке). Кроме того, ленивый '*?' Заставит char с помощью сопоставления символов, что замедляет все это. С '{[^}] *}' вы сопоставляете '{', любые символы 0+, кроме '}' жадно, как можно больше, вплоть до первого '}' (так что, даже если есть разрывы строк внутри , они будут согласованы). Поскольку соответствие является жадным, скорость сопоставления здесь намного выше. Лучше всего: если вы можете избавиться от '. *'/'. *?' В шаблоне, замените их более точным эквивалентом. –

Смежные вопросы