Регулярний вираз для отримання рядка між дужками в JavaScript


177

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

I expect five hundred dollars ($500).

повернеться

$500

Знайдено регулярний вираз для отримання рядка між двома рядками в Javascript

Але я новачок з регексом. Я не знаю, як використовувати '(', ')' в regexp



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

Відповіді:


460

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

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]
  })



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 на основі.
Wiktor Stribiżew


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.