Regex, чтобы получить строку между фигурными скобками "{Я хочу, что между фигурными скобками}" - PullRequest
98 голосов
/ 05 января 2009

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

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


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

Ответы [ 13 ]

235 голосов
/ 05 января 2009

Попробуйте

/{(.*?)}/

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

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

/{([^}]*)}/

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

139 голосов
/ 05 января 2009
/\{([^}]+)\}/

/        - 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
37 голосов
/ 05 января 2009

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

>>> var g='{getThis}';
>>> g.substring(1,g.length-1)
"getThis"
21 голосов
/ 30 мая 2017

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

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

Например

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

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

18 голосов
/ 09 августа 2011

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

var st = '{getThis}';

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

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

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

var nameAttr = "randomstring999[fieldname]";

var justName = nameAttr.replace(/.*\[|\]/gi,''); // "fieldname"
14 голосов
/ 15 декабря 2009

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

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

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

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

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

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

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

10 голосов
/ 11 ноября 2010

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

(?<=\{)(.*?)(?=\})
5 голосов
/ 09 августа 2018

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

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"]
3 голосов
/ 23 сентября 2016

Попробуйте, в соответствии с http://www.regextester.com это работает для js обычно.

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

3 голосов
/ 02 ноября 2012
var re = /{(.*)}/;
var m = "{helloworld}".match(re);
if (m != null)
    console.log(m[0].replace(re, '$1'));

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...