Regex, чтобы получить строку между фигурными скобками "{Я хочу, что между фигурными скобками}"

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

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


Похожие вопросы по переполнению стека:

17 ответов

Решение

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

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

Пытаться

/{(.*?)}/

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

Другой способ будет

/{([^}]*)}/

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

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

/        - 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

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

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

Например

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

вернусь gskinner.com, ssd.sd,

Попробуй это

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

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

var st = '{getThis}';

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

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

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

var nameAttr = "randomstring999[fieldname]";

var justName = nameAttr.replace(/.*\[|\]/gi,''); // "fieldname"

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

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

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

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

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

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

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

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

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

Я изучил другие ответы, и в них, похоже, отсутствует жизненная логика. то есть, выбирайте все в двух последовательных скобках, но НЕ в скобках

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

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

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

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

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

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

Пример:

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

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

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

var re = /{(.*)}/;
var m = "{helloworld}".match(re);
if (m != null)
    console.log(m[0].replace(re, '$1'));

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

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

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

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

Разделите содержимое внутри фигурных скобок ({}) с шаблоном вроде, {'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}]
      echo '/{id}/{name}/{age}' |
mawk NF=NF FS='(^|[}]+)(/[{]+|$)' OFS='\v'
      id
  name
      age

Вы можете извлечь их так же легко, используя самый мягкий вкусERE

Вы можете использовать метод String.slice().

      let str = "{something}";
str = str.slice(1,-1) // something
Другие вопросы по тегам