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


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

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


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

  • как можно превратить обычные кавычки (т. е.',") в кавычки LaTeX/TeX (т. е.`,`")
  • регулярное выражение: чтобы вытащить подстроку между двумя тегами в строке
  • регулярное выражение для замены всех n в строке, но не те, что внутри [code] [/code] tag
13 91

13 ответов:

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

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

попробовать

/{(.*?)}/

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

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

/{([^}]*)}/

это соответствует любому символу, кроме a } char (другой способ не быть жадным)

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

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

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

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

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

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

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

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

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

вот простое решение с помощью javascript replace

var st = '{getThis}';

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

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

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

var nameAttr = "randomstring999[fieldname]";

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

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

/[^{\}]+(?=})/g
Welcome to RegExr v2.1 by #{gskinner.com},  #{ssd.sd} hosted by Media Temple!

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

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

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

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

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

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

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

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

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

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

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

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

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

попробуй такое

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"]