Регулярное выражение для получения строки между фигурными скобками

К сожалению, несмотря на то, что я пытался изучать регулярное выражение хотя бы раз в год в течение стольких лет, сколько я себя помню, я всегда забываю, поскольку использую их так редко. В этом году мое новогоднее решение - больше не пытаться выучить регулярное выражение - Так что в этом году, чтобы спасти меня от слез, я отдам его на Stack Overflow. (Последний рождественский ремикс).

Я хочу передать строку в этом формате {getThis} и вернуть строку getThis. Может ли кто-нибудь помочь придерживаться моего новогоднего решения?


Связанные вопросы о переполнении стека:

Этот вопрос был добавлен в Часто задаваемые вопросы о регулярных выражениях при переполнении стека в разделе «Advanced Regex-Fu».

aliteralmind 10.04.2014 05:36

@Kobi: FAQ - это вики. Кто угодно может его редактировать. Так что отредактируйте это.

aliteralmind 26.04.2014 15:33
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
126
2
269 984
15
Перейти к ответу Данный вопрос помечен как решенный

Ответы 15

Пытаться

/{(.*?)}/

Это означает, что сопоставьте любой символ между {и}, но не будьте жадными - сопоставьте самую короткую строку, которая заканчивается на} (? Перестает * быть жадным). Скобки позволяют извлечь совпавшую часть.

Другой способ был бы

/{([^}]*)}/

Соответствует любому символу, кроме символа} (еще один способ не жадничать)

это отлично, но возможно ли сопоставить что-нибудь между переменным количеством комбинаций фигурных скобок? Например: «{это должно совпадать} это не должно {это вроде должно быть снова} и т. д. {Далее}»? Я хочу получить значение, не заключенное в фигурные скобки. Также: фигурные скобки не будут использоваться в предложении и не будет складываться (это никогда не произойдет: "{some {text}}"). Кто-нибудь знает, как это сделать :)? Спасибо! (p.s .: проголосовали за это решение)

Igor 26.05.2013 21:22

Он не захватывает все, что находится между фигурными скобками, он захватывает все, что находится между фигурными скобками И самими фигурными скобками. Как бы вы записали ТОЛЬКО то, что находится внутри фигурных скобок?

Reality-Torrent 19.01.2016 15:40

В круглых скобках записаны символы между фигурными скобками.

Paul Dixon 20.01.2016 00:16

Мне нравится, что вам не нужно избегать фигурных скобок здесь, поскольку парсер регулярных выражений, кажется, понимает, что они не квантификатор ... ну, я делаю это на python, но я предполагаю, что регулярные выражения javascript работают так тоже

drevicko 10.02.2016 15:26

Так как бы это было для любого количества повторений? Это соответствует только первому.

Pier 03.07.2016 20:06

Добавление g в конце делает его глобальным поиском. См. рабочий пример

Benjamin 05.07.2016 18:56

+1 за "the? Останавливает * beeing greedy", я еще посмотрю на это. Я всегда использовал решение [^], но всегда находил его не очень приятным ...

fpierrat 07.12.2016 11:27

@ Reality-Torrent, я тоже видел, что он захватил фигурные скобки, если я укажу опцию g, чтобы получить все совпадения. Оказывается, я должен использовать Regex.exec в цикле вместо string.match в Javascript, чтобы иметь как флаг g, так и разрешить группу захвата. См. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

frank 23.07.2019 23:39
Ответ принят как подходящий

Если ваша строка всегда будет в этом формате, регулярное выражение будет излишним:

>>> var g='{getThis}';
>>> g.substring(1,g.length-1)
"getThis"

substring(1 означает начало одного символа (сразу после первого {), а ,g.length-1) означает принятие символов до (но не включая) символа с длиной строки минус один. Это работает, потому что позиция отсчитывается от нуля, то есть g.length-1 - последняя позиция.

Для читателей, отличных от исходного плаката: если имеет является регулярным выражением, используйте /{([^}]*)}/, если вы хотите разрешить пустые строки, или /{([^}]+)}/, если вы хотите найти совпадение только тогда, когда между фигурными скобками есть хотя бы один символ. Авария:

  • /: запустить шаблон регулярного выражения
    • {: буквальная фигурная скобка
      • (: начать запись
        • [: начните определять класс персонажей для захвата
          • ^}: "что-нибудь кроме }"
        • ]: Хорошо, это определение всего нашего класса
        • *: любое количество символов, соответствующих этому классу, который мы только что определили
      • ): запись завершена
    • }: буквальная фигурная скобка должна сразу следовать за тем, что мы сняли
  • /: завершить шаблон регулярного выражения

не придираться, но код не должен быть g.substring (1g.length-2)

almog.ori 09.06.2009 17:10

На самом деле не должно. substring () начинается с 0, а длина - с 1, а второй аргумент substring () - это позиция в исходной строке, на которой нужно остановиться, а не длина возвращаемой строки. Попробуйте сами, а затем попробуйте использовать 5 в качестве первого аргумента. (Вышеупомянутое я на самом деле просто скопировал и вставил из Firebug, чтобы убедиться, что он изначально был правильным.)

Kev 09.06.2009 22:06

Подстрока - одна из тех вещей, которые меняются в зависимости от языка, на котором вы работаете. Javascript принимает индекс, на котором останавливается, PHP принимает длину желаемого конечного результата (если он не является отрицательным, и в этом случае требуется количество удаляемых символов) , C# снова другой ... красивый и запутанный.

jvenema 26.01.2010 03:55

... и Python просто имеет нарезку, что IMO лучше, чем что-либо еще: p.

Grant Paul 03.03.2010 09:25

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

baash05 30.11.2011 04:04

@ baash05, если вы прочитали весь вопрос, ОП даже не хотел изучать регулярное выражение, поэтому я не думаю, что это академическое упражнение, которое вы, похоже, предполагаете.

Kev 07.12.2011 20:50

@ Даррон, спасибо за поддержку. Всякий раз, когда я получаю отрицательный голос по этому поводу, я сначала должен прочитать ваш комментарий. :)

Kev 02.04.2014 23:52

Я хотел сделать -1, потому что вопрос задает регулярное выражение, я искал регулярное выражение, но принятый ответ был для меня совершенно бесполезен (хотя сам вопрос казался очень многообещающим). После прочтения первого комментария я должен признать, что если бы я сначала ответил на этот вопрос, я бы ответил так же / аналогично ... Итак, в конце концов, +1.

shadyyx 04.07.2014 12:14

Проголосовали против, если не ответили на вопрос. OP запросил регулярное выражение. Неуместно предполагать вариант использования, если он не указан. Например, OP, возможно, захочет хранить универсальное правило в базе данных, которое будет работать на нескольких языках, чтобы применять одну и ту же проверку как для внешнего, так и для внутреннего интерфейса. Не изменяйте вопрос, не будучи уверенным, что ваш вариант использования соответствует потребностям.

mopsyd 19.02.2019 16:28

@mopsyd OP был помечен как JavaScript. Если бы OP хотел многоязычное решение, я бы сказал, что по-прежнему говорит, что регулярное выражение в этом случае излишне, и каждый язык имеет свой эквивалент этого гораздо более эффективного подхода. Я не переделывал - я использовал всю доступную информацию. Кроме того, OP - это тот, кто отметил мой ответ как принятый, не так ли?

Kev 20.02.2019 09:38

@Kev Он помечен как javascript и regex. Вопросы остаются общедоступными, поэтому они помогут кому-либо еще с той же проблемой в будущем, независимо от того, выбрал ли задающий ваш ответ явным образом. Ответы, несовместимые с формулировкой вопроса, приводят к тому, что другие подобные вопросы закрываются как обман без ответа. Регулярное выражение является излишним, когда оно выполняет жадный или обратный поиск, в противном случае оно довольно производительно.

mopsyd 21.02.2019 00:39

@mopsyd И если у кого-то точно такие же требования, я все равно считаю, что это лучший подход. Иногда, когда клиенты говорят «дайте мне это решение», вам нужно заглянуть под их вопрос, в чем проблема на самом деле, иначе вы тратите много дополнительного времени на реализацию чего-то сомнительного, основанного на их неверных предположениях. Это ничем не отличается.

Kev 21.02.2019 10:21

Он попросил регулярное выражение, оно прямо в заголовке. Голос против остается, преодолеть это.

mopsyd 19.07.2019 20:32

Хорошо, теперь я действительно запутался, я обновил свой ответ, чтобы предоставить регулярное выражение, и я все еще получаю отрицательные голоса.

Kev 17.07.2020 15:40
/\{([^}]+)\}/

/        - delimiter
\{       - opening literal brace escaped because it is a special character used for quantifiers eg {2,3}
(        - start capturing
[^}]     - character class consisting of
    ^    - not
    }    - a closing brace (no escaping necessary because special characters in a character class are different)
+        - one or more of the character class
)        - end capturing
\}       - the closing literal brace
/        - delimiter

@meouw sa = s.split ("/ \ {([^}] +) \} /"); дает ошибку компиляции. недопустимое повторение, недопустимый escape-символ.

likejudo 26.12.2012 04:22

@Anil, похоже, вы используете строку в качестве аргумента разделения, а не регулярное выражение. Что ты пытаешься сделать?

meouw 27.12.2012 02:09

Этот работает в Textmate и соответствует всему в файле CSS между фигурными скобками.

\{(\s*?.*?)*?\}

selector {. . matches here including white space. . .}

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

\{((\s*?.*?)*?)\}

и вы можете получить доступ к содержимому через $ 1.

Это также работает для функций, но я не тестировал его с вложенными фигурными скобками.

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

(?<=\{)(.*?)(?=\})

Вместо фигурных скобок выше должна быть обратная косая черта. В моем представлении они были исключены.

Robert Cesaric 11.11.2010 15:28

Спасибо, это помогло мне сегодня.

ProfessionalAmateur 22.12.2010 20:28

какие недостатки у этого метода?

Somatik 11.05.2012 17:24

@ Somatik - да, отрицательный просмотр вперед и назад не поддерживается в ECMAScript.

RobG 04.05.2014 11:28

Примечание. Этот пример работает на Java. Возвращает все значения во всех фигурных скобках.

Multiplexor 07.05.2019 06:31

Хотел бы я проголосовать за это больше, так как это единственный правильный ответ на этой странице.

HisDivineShadow 21.05.2019 23:03

Вот простое решение с использованием замены javascript

var st = '{getThis}';

st = st.replace(/\{|\}/gi,''); // "getThis"

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

Если у вас есть строка типа "randomstring999 [fieldname]" Вы используете немного другой шаблон, чтобы получить имя поля

var nameAttr = "randomstring999[fieldname]";

var justName = nameAttr.replace(/.*\[|\]/gi,''); // "fieldname"
var re = /{(.*)}/;
var m = "{helloworld}".match(re);
if (m != null)
    console.info(m[0].replace(re, '$1'));

К сожалению, более простой .replace(/.*{(.*)}.*/, '$1') возвращает всю строку, если регулярное выражение не совпадает. В приведенном выше фрагменте кода легче обнаружить совпадение.

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

 /\{([^}]+)\}/gm 

Попробуйте этот, согласно http://www.regextester.com он нормально работает для js.

([^{]*?)(?=\})

для множественного выбора можно использовать /([^{]*?)\w(?=\})/gmi

Павло Коменда 23.09.2016 16:01

Попробуй это:

/[^{\}]+(?=})/g

Например

Welcome to RegExr v2.1 by #{gskinner.com},  #{ssd.sd} hosted by Media Temple!

вернет gskinner.com, ssd.sd.

Отлично, вы можете объяснить, почему вы используете \} в первом блоке?

Uzair Ali 04.04.2018 16:35

Хороший, но он будет соответствовать любой группе, которая заканчивается на }, даже если она не начинается на {.

Ahmad Ibrahim 21.05.2018 19:28

Это единственный правильный ответ, который действительно работает.

pldg 02.07.2018 16:26

Объяснение: Хотя [^ \ {\}] + будет соответствовать всему, что не является фигурной скобкой, утверждение просмотра вперед (? =}) Гарантирует, что передаются только разделы, предшествующие фигурной скобке. С / ... / g мы получаем все вхождения, а не только первое.

0-_-0 30.11.2019 23:45

Я просмотрел другие ответы, и, похоже, в них отсутствует жизненная логика. т.е. выберите все между двумя ПОСЛЕДУЮЩИМИ скобками, но НЕ скобки

Итак, вот мой ответ

\{([^{}]+)\}

Вы можете использовать эту рекурсию регулярных выражений для сопоставления всего, что находится между ними, даже другого {} (например, текста JSON):

\{([^()]|())*\}

Хорошо, но это захватывает только содержимое внутри вложенных фигурных скобок.

Dominic 12.03.2018 18:42

не захватывает, если контент содержит ()

Mert Mertce 27.09.2019 18:49

Попробуй это

let path = "/{id}/{name}/{age}";
const paramsPattern = /[^{\}]+(?=})/g;
let extractParams = path.match(paramsPattern);
console.info("extractParams", extractParams) // prints all the names between {} = ["id", "name", "age"]

Именно то, что я хотел :), это вернет результат без фигурных скобок, другие решения вернутся с ним

Al-Mothafar 17.10.2018 13:06

Отлично, лучший ответ здесь.

michal.jakubeczy 12.11.2019 14:42

Даже это помогает мне решать чью-то проблему,

Split the contents inside curly braces ({}) having a pattern like, {'day': 1, 'count': 100}.

Например:

#include <iostream> 
#include <regex> 
#include<string> 
using namespace std; 

int main() 
{ 
    //string to be searched
    string s = "{'day': 1, 'count': 100}, {'day': 2, 'count': 100}";

    // regex expression for pattern to be searched 
    regex e ("\\{[a-z':, 0-9]+\\}");
    regex_token_iterator<string::iterator> rend;

    regex_token_iterator<string::iterator> a ( s.begin(), s.end(), e );
    while (a!=rend) cout << " [" << *a++ << "]";
    cout << endl;

    return 0; 
}

Выход:

[{'day': 1, 'count': 100}] [{'day': 2, 'count': 100}]

Этот подходит ко всему, даже если он находит несколько закрывающих фигурных скобок в середине:

\{([\s\S]*)\}

Пример:

{
  "foo": {
    "bar": 1,
    "baz": 1,
  }
}

Другие вопросы по теме