2013-07-22 2 views
109

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

I expect five hundred dollars ($500). 

вернется

$500 

Найдено Regular Expression to get a string between two strings in Javascript

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

+0

возможно дубликат [регулярное выражение, чтобы найти строку, заключенная между двумя символами, в то время как КРОМЕ разделители] (http://stackoverflow.com/questions/1454913/regular-expression-to- find-a-string-included-between-two-characters-while-exclu) –

+0

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

ответ

303

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

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

+11

+1 Ницца, работал как шарм. Я хотел бы добавить вас, чтобы добавить это http://tinyurl.com/mog7lr3 в свое объяснение. – Praveen

+5

@ user1671639: Обновлено. Спасибо за ссылку! –

+0

Что делать, если мне требуется восстановить [something] – CodeGuru

3

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

or \(.+\) fo Г-нибудь внутри скобок

+1

Это будет работать для образца текста, однако если другой ')' появится позже в строке типа 'Я ожидаю пятьсот долларов ($ 500). (но я собираюсь заплатить). Жадность '+' будет захватывать намного больше. –

+0

@Denomales Итак, как бы вы могли захватить оба экземпляра этих строк. В идеале я делаю что-то подобное, но я бы хотел: '($ 500)' и '(но я собираюсь заплатить)' можно совместить, но в двух раздельных совпадениях, а не в одном совпадающем элементе? Заранее благодарим! –

23

Try строки:

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

или регулярное выражение (что несколько slow compare to the above)

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)); 
} 
+2

Запустив этот jsperf сегодня в Chrome 59.0.3071, регулярное выражение было быстрее на 8% –

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

Этот код предупреждает обо всех матчах.

Ссылки:

поиск http://www.w3schools.com/jsref/jsref_obj_regexp.asp

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

4

адаптированное Mr_Green's answer к функциональному стилю программирования, чтобы избежать использования "= п?" временные глобальные переменные.

var matches = string2.split('[') 
    .filter(function(v){ return v.indexOf(']') > -1}) 
    .map(function(value) { 
    return value.split(']')[0] 
    }) 
1

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

Примечание: это решение используется для строки, которая имеет только одного "(" и ")", как строка в этом вопросе.

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

Online demo (jsfiddle)

Смежные вопросы