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


178

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

I expect five hundred dollars ($500).

вернется

$500

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

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



Вы можете использовать приведенное ниже решение 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


8

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

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

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

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


5

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

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


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.
Виктор Стрибьев


2

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

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

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


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.