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

178

Я пытаюсь написать регулярное выражение, которое возвращает строку между скобками. Например: я хочу получить строку, которая находится между строками "(" и ")"

I expect five hundred dollars ($500).

вернется

$500

Найдено регулярное выражение, чтобы получить строку между двумя строками в Javascript

Но я новичок в регулярных выражениях. Я не знаю, как использовать '(', ')' в регулярном выражении

Okky
источник
Вы можете использовать приведенное ниже решение go-oleg, слегка измененное для проверки на знак доллара:var regExp = /\(\$([^)]+)\)/;
Dom Day

Ответы:

461

Вам необходимо создать набор экранированных (с \) круглых скобок (соответствующих скобкам) ​​и группу регулярных круглых скобок, которые создают вашу группу захвата:

var regExp = /\(([^)]+)\)/;
var matches = regExp.exec("I expect five hundred dollars ($500).");

//matches[1] contains the value between the parentheses
console.log(matches[1]);

Сломать:

  • \( : соответствовать открывающим скобкам
  • ( : начать захват группы
  • [^)]+: соответствовать одному или нескольким не ) символам
  • ) : группа захвата конца
  • \) : закрывающие скобки

Вот визуальное объяснение RegExplained

гоу-олег
источник
12
+1 Хорошо, сработало как шарм. Я хотел бы добавить вас, чтобы добавить этот tinyurl.com/mog7lr3 в ваш для визуального объяснения.
Правин
5
@ user1671639: Обновлено. Спасибо за ссылку!
go-oleg
5
Это не работает, если в скобках есть скобки, которые вы хотите записать. Например: «Я ожидаю пятьсот долларов (500 долларов (но я знаю, что больше никогда не увижу эти деньги))».
JayB
1
Это регулярное выражение работает только в случае совпадения одного экземпляра на одну строку. Использование глобального /gфлага не будет работать, как ожидалось.
silkAdmin
2
Каково решение, если у вас есть несколько строк в скобках, как показано ниже: «Я ожидаю (пять) сотен долларов ($ 500)», скажем, я хочу массив этих специальных строк.
Мохамад Аль Асмар
33

Попробуйте манипуляции со строками:

var txt = "I expect five hundred dollars ($500). and new brackets ($600)";
var newTxt = txt.split('(');
for (var i = 1; i < newTxt.length; i++) {
    console.log(newTxt[i].split(')')[0]);
}

или регулярное выражение ( что несколько медленнее по сравнению с вышеупомянутым )

var txt = "I expect five hundred dollars ($500). and new brackets ($600)";
var regExp = /\(([^)]+)\)/g;
var matches = txt.match(regExp);
for (var i = 0; i < matches.length; i++) {
    var str = matches[i];
    console.log(str.substring(1, str.length - 1));
}
Мистер Грин
источник
7
Выполняя этот jsperf сегодня в Chrome 59.0.3071, регулярное выражение было быстрее на 8%
Alex McMillan
9

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

var matches = string2.split('[')
  .filter(function(v){ return v.indexOf(']') > -1})
  .map( function(value) { 
    return value.split(']')[0]
  })
silkAdmin
источник
Что я искал stackoverflow.com/questions/49614116/…
wobsoriano
8

Простое решение

Примечание : это решение может быть использовано для строк, имеющих в этом вопросе только одну «(» и «)» строку.

("I expect five hundred dollars ($500).").match(/\((.*)\)/).pop();

Демо онлайн (jsfiddle)

Али Солтани
источник
5

Только для цифр после знака валюты: \(.+\s*\d+\s*\)должно работать

Или \(.+\)для чего-нибудь в скобках

P0W
источник
2
Это будет работать для образца текста, однако, если )позже в строке появится другой, например, I expect five hundred dollars ($500). (but I'm going to pay).жадность, +будет захватывать гораздо больше.
Ro Yo Mi
@Denomales Итак, как бы вы захватили оба экземпляра этих строк. В идеале я делаю что-то похожее, но я хотел бы иметь: ($500)и (but I'm going to pay) быть сопоставленным, но в двух отдельных матчах, а не считаться одним сопоставленным элементом? Заранее спасибо!
Том Берд
(. +) работал для моего требования. Нужно было захватывать такие вещи, как "Dunhill (Бутылка / Пакет / Пот / Выстрел)" и возвращать просто "Dunhill"
GentleGiant
5

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

\(([^()]*)\)

шаблон. Смотрите на регулярное выражение демо .

В JavaScript используйте его как

var rx = /\(([^()]*)\)/g;

Детали шаблона

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

Самая современная демонстрация кода JavaScript (с использованием matchAll):

const strs = ["I expect five hundred dollars ($500).", "I expect.. :( five hundred dollars ($500)."];
const rx = /\(([^()]*)\)/g;
strs.forEach(x => {
  const matches = [...x.matchAll(rx)];
  console.log( Array.from(matches, m => m[0]) ); // All full match values
  console.log( Array.from(matches, m => m[1]) ); // All Group 1 values
});

Устаревшая демонстрация кода JavaScript (совместимая с ES5):

Виктор Стрибьев
источник
Это регулярное выражение прекрасно, потому что оно захватывает только пары ()и их содержимое, даже если они находятся рядом ()().
безлимитный
1
@limitlessloop Так как это кажется полезным ответом, я также добавил новую matchAllдемонстрационную версию кода JavaScript.
Виктор Стрибьев
3

let str = "Before brackets (Inside brackets) After brackets".replace(/.*\(|\).*/g, '');
console.log(str) // Inside brackets

Andran
источник
2

Альтернатива:

var str = "I expect five hundred dollars ($500) ($1).";
str.match(/\(.*?\)/g).map(x => x.replace(/[()]/g, ""));
 (2) ["$500", "$1"]

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

marcofriso
источник
1
var str = "I expect five hundred dollars ($500) ($1).";
var rex = /\$\d+(?=\))/;
alert(rex.exec(str));

Соответствует первому числу, начинающемуся с символа $, за которым следует ')'. ')' не будет частью матча. Код предупреждает с первым совпадением.

var str = "I expect five hundred dollars ($500) ($1).";
var rex = /\$\d+(?=\))/g;
var matches = str.match(rex);
for (var i = 0; i < matches.length; i++)
{
    alert(matches[i]);
}

Этот код оповещает обо всех совпадениях.

Ссылки:

поиск "? = n" http://www.w3schools.com/jsref/jsref_obj_regexp.asp

поиск "x (? = y)" https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp

AJ Dhaliwal
источник