К сожалению, несмотря на то, что я пытался изучать регулярное выражение хотя бы раз в год в течение стольких лет, сколько я себя помню, я всегда забываю, поскольку использую их так редко. В этом году мое новогоднее решение - больше не пытаться выучить регулярное выражение - Так что в этом году, чтобы спасти меня от слез, я отдам его на Stack Overflow. (Последний рождественский ремикс).
Я хочу передать строку в этом формате {getThis} и вернуть строку getThis. Может ли кто-нибудь помочь придерживаться моего новогоднего решения?
Связанные вопросы о переполнении стека:
@Kobi: FAQ - это вики. Кто угодно может его редактировать. Так что отредактируйте это.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Пытаться
/{(.*?)}/
Это означает, что сопоставьте любой символ между {и}, но не будьте жадными - сопоставьте самую короткую строку, которая заканчивается на} (? Перестает * быть жадным). Скобки позволяют извлечь совпавшую часть.
Другой способ был бы
/{([^}]*)}/
Соответствует любому символу, кроме символа} (еще один способ не жадничать)
это отлично, но возможно ли сопоставить что-нибудь между переменным количеством комбинаций фигурных скобок? Например: «{это должно совпадать} это не должно {это вроде должно быть снова} и т. д. {Далее}»? Я хочу получить значение, не заключенное в фигурные скобки. Также: фигурные скобки не будут использоваться в предложении и не будет складываться (это никогда не произойдет: "{some {text}}"). Кто-нибудь знает, как это сделать :)? Спасибо! (p.s .: проголосовали за это решение)
Он не захватывает все, что находится между фигурными скобками, он захватывает все, что находится между фигурными скобками И самими фигурными скобками. Как бы вы записали ТОЛЬКО то, что находится внутри фигурных скобок?
В круглых скобках записаны символы между фигурными скобками.
Мне нравится, что вам не нужно избегать фигурных скобок здесь, поскольку парсер регулярных выражений, кажется, понимает, что они не квантификатор ... ну, я делаю это на python, но я предполагаю, что регулярные выражения javascript работают так тоже
Так как бы это было для любого количества повторений? Это соответствует только первому.
Добавление g в конце делает его глобальным поиском. См. рабочий пример
+1 за "the? Останавливает * beeing greedy", я еще посмотрю на это. Я всегда использовал решение [^], но всегда находил его не очень приятным ...
@ Reality-Torrent, я тоже видел, что он захватил фигурные скобки, если я укажу опцию g, чтобы получить все совпадения. Оказывается, я должен использовать Regex.exec в цикле вместо string.match в Javascript, чтобы иметь как флаг g, так и разрешить группу захвата. См. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Если ваша строка всегда будет в этом формате, регулярное выражение будет излишним:
>>> var g='{getThis}';
>>> g.substring(1,g.length-1)
"getThis"
substring(1 означает начало одного символа (сразу после первого {), а ,g.length-1) означает принятие символов до (но не включая) символа с длиной строки минус один. Это работает, потому что позиция отсчитывается от нуля, то есть g.length-1 - последняя позиция.
Для читателей, отличных от исходного плаката: если имеет является регулярным выражением, используйте /{([^}]*)}/, если вы хотите разрешить пустые строки, или /{([^}]+)}/, если вы хотите найти совпадение только тогда, когда между фигурными скобками есть хотя бы один символ. Авария:
/: запустить шаблон регулярного выражения
{: буквальная фигурная скобка
(: начать запись
[: начните определять класс персонажей для захвата
^}: "что-нибудь кроме }"]: Хорошо, это определение всего нашего класса*: любое количество символов, соответствующих этому классу, который мы только что определили): запись завершена}: буквальная фигурная скобка должна сразу следовать за тем, что мы сняли/: завершить шаблон регулярного выраженияне придираться, но код не должен быть g.substring (1g.length-2)
На самом деле не должно. substring () начинается с 0, а длина - с 1, а второй аргумент substring () - это позиция в исходной строке, на которой нужно остановиться, а не длина возвращаемой строки. Попробуйте сами, а затем попробуйте использовать 5 в качестве первого аргумента. (Вышеупомянутое я на самом деле просто скопировал и вставил из Firebug, чтобы убедиться, что он изначально был правильным.)
Подстрока - одна из тех вещей, которые меняются в зависимости от языка, на котором вы работаете. Javascript принимает индекс, на котором останавливается, PHP принимает длину желаемого конечного результата (если он не является отрицательным, и в этом случае требуется количество удаляемых символов) , C# снова другой ... красивый и запутанный.
... и Python просто имеет нарезку, что IMO лучше, чем что-либо еще: p.
Милый, но не знаю, как это регулярное выражение. Возможно, он просил регулярное выражение, и я пришел сюда за тем же ответом .. к сожалению, ответ не имеет ничего общего с вопросом ..
@ baash05, если вы прочитали весь вопрос, ОП даже не хотел изучать регулярное выражение, поэтому я не думаю, что это академическое упражнение, которое вы, похоже, предполагаете.
@ Даррон, спасибо за поддержку. Всякий раз, когда я получаю отрицательный голос по этому поводу, я сначала должен прочитать ваш комментарий. :)
Я хотел сделать -1, потому что вопрос задает регулярное выражение, я искал регулярное выражение, но принятый ответ был для меня совершенно бесполезен (хотя сам вопрос казался очень многообещающим). После прочтения первого комментария я должен признать, что если бы я сначала ответил на этот вопрос, я бы ответил так же / аналогично ... Итак, в конце концов, +1.
Проголосовали против, если не ответили на вопрос. OP запросил регулярное выражение. Неуместно предполагать вариант использования, если он не указан. Например, OP, возможно, захочет хранить универсальное правило в базе данных, которое будет работать на нескольких языках, чтобы применять одну и ту же проверку как для внешнего, так и для внутреннего интерфейса. Не изменяйте вопрос, не будучи уверенным, что ваш вариант использования соответствует потребностям.
@mopsyd OP был помечен как JavaScript. Если бы OP хотел многоязычное решение, я бы сказал, что по-прежнему говорит, что регулярное выражение в этом случае излишне, и каждый язык имеет свой эквивалент этого гораздо более эффективного подхода. Я не переделывал - я использовал всю доступную информацию. Кроме того, OP - это тот, кто отметил мой ответ как принятый, не так ли?
@Kev Он помечен как javascript и regex. Вопросы остаются общедоступными, поэтому они помогут кому-либо еще с той же проблемой в будущем, независимо от того, выбрал ли задающий ваш ответ явным образом. Ответы, несовместимые с формулировкой вопроса, приводят к тому, что другие подобные вопросы закрываются как обман без ответа. Регулярное выражение является излишним, когда оно выполняет жадный или обратный поиск, в противном случае оно довольно производительно.
@mopsyd И если у кого-то точно такие же требования, я все равно считаю, что это лучший подход. Иногда, когда клиенты говорят «дайте мне это решение», вам нужно заглянуть под их вопрос, в чем проблема на самом деле, иначе вы тратите много дополнительного времени на реализацию чего-то сомнительного, основанного на их неверных предположениях. Это ничем не отличается.
Он попросил регулярное выражение, оно прямо в заголовке. Голос против остается, преодолеть это.
Хорошо, теперь я действительно запутался, я обновил свой ответ, чтобы предоставить регулярное выражение, и я все еще получаю отрицательные голоса.
/\{([^}]+)\}/
/ - 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-символ.
@Anil, похоже, вы используете строку в качестве аргумента разделения, а не регулярное выражение. Что ты пытаешься сделать?
Этот работает в Textmate и соответствует всему в файле CSS между фигурными скобками.
\{(\s*?.*?)*?\}
selector {.
.
matches here
including white space.
.
.}
Если вы хотите в дальнейшем иметь возможность возвращать контент, заключите все это в еще один набор круглых скобок, например так:
\{((\s*?.*?)*?)\}
и вы можете получить доступ к содержимому через $ 1.
Это также работает для функций, но я не тестировал его с вложенными фигурными скобками.
Вы хотите использовать просмотр вперед и назад по регулярному выражению. Это даст вам только то, что находится внутри фигурных скобок:
(?<=\{)(.*?)(?=\})
Вместо фигурных скобок выше должна быть обратная косая черта. В моем представлении они были исключены.
Спасибо, это помогло мне сегодня.
какие недостатки у этого метода?
@ Somatik - да, отрицательный просмотр вперед и назад не поддерживается в ECMAScript.
Примечание. Этот пример работает на Java. Возвращает все значения во всех фигурных скобках.
Хотел бы я проголосовать за это больше, так как это единственный правильный ответ на этой странице.
Вот простое решение с использованием замены 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
Попробуй это:
/[^{\}]+(?=})/g
Например
Welcome to RegExr v2.1 by #{gskinner.com}, #{ssd.sd} hosted by Media Temple!
вернет gskinner.com, ssd.sd.
Отлично, вы можете объяснить, почему вы используете \} в первом блоке?
Хороший, но он будет соответствовать любой группе, которая заканчивается на }, даже если она не начинается на {.
Это единственный правильный ответ, который действительно работает.
Объяснение: Хотя [^ \ {\}] + будет соответствовать всему, что не является фигурной скобкой, утверждение просмотра вперед (? =}) Гарантирует, что передаются только разделы, предшествующие фигурной скобке. С / ... / g мы получаем все вхождения, а не только первое.
Я просмотрел другие ответы, и, похоже, в них отсутствует жизненная логика. т.е. выберите все между двумя ПОСЛЕДУЮЩИМИ скобками, но НЕ скобки
Итак, вот мой ответ
\{([^{}]+)\}
Вы можете использовать эту рекурсию регулярных выражений для сопоставления всего, что находится между ними, даже другого {} (например, текста JSON):
\{([^()]|())*\}
Хорошо, но это захватывает только содержимое внутри вложенных фигурных скобок.
не захватывает, если контент содержит ()
Попробуй это
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"]
Именно то, что я хотел :), это вернет результат без фигурных скобок, другие решения вернутся с ним
Отлично, лучший ответ здесь.
Даже это помогает мне решать чью-то проблему,
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,
}
}
Этот вопрос был добавлен в Часто задаваемые вопросы о регулярных выражениях при переполнении стека в разделе «Advanced Regex-Fu».