javascript, regex анализирует содержимое строки в фигурных скобках - PullRequest
13 голосов
/ 20 марта 2012

Я новичок в регулярных выражениях. Я пытаюсь разобрать все содержимое в фигурных скобках в строке. Я посмотрел этот пост в качестве ссылки и сделал именно так, как предлагает один из ответов, однако результат неожиданный.

Вот что я сделал

var abc = "test/abcd{string1}test{string2}test" //any string
var regex = /{(.+?)}/
regex.exec(abc) // i got ["{string1}", "string1"]
             //where i am expecting ["string1", "string2"]

я думаю, что что-то упустил, что я делаю не так?

обновление

я смог получить его с помощью /g для глобального поиска

var regex = /{(.*?)}/g
abc.match(regex) //gives ["{string1}", "{string2}"]

как я могу получить строку без скобок?

Ответы [ 5 ]

22 голосов
/ 20 марта 2012
"test/abcd{string1}test{string2}test".match(/[^{}]+(?=\})/g)

производит

["string1", "string2"]

Предполагается, что каждый } имеет соответствующий { перед ним, а {...} разделы не вкладываются. Он также не будет захватывать содержимое пустых {} разделов.

2 голосов
/ 20 марта 2012
var abc = "test/abcd{string1}test{string2}test" //any string
var regex = /{(.+?)}/g
var matches;

while(matches = regex.exec(abc))
    console.log(matches);
1 голос
/ 20 марта 2012

Попробуйте это:

var abc = "test/abcd{string1}test{string2}test" //any string
var regex = /{(.+?)}/g //g flag so the regex is global
abc.match(regex) //find every match

хорошее место для чтения о Regex в javascript - это здесь , а хорошее место для тестирования - здесь

удачи!

0 голосов
/ 20 марта 2012

Ничего плохого. Но вам нужно взглянуть на ваши группы захвата (второй элемент в массиве), чтобы получить желаемый контент (вы можете игнорировать первый). Чтобы получить все случаи, недостаточно запустить exec один раз, вам нужно перебрать результаты, используя match.

Редактировать : не важно, что вы не можете получить доступ к группам захвата с помощью match. Более простым решением было бы использование позитивного взгляда, поскольку Майк Самуэль предложил .

0 голосов
/ 20 марта 2012

Этот результат:

["{string1}", "string1"]

показывает, что для первого совпадения все регулярные выражения соответствуют "{string1}", а первые захватывающие скобки совпадают "string1".

Если вы хотите получить все совпадения и увидеть все захваченные паренсы каждого совпадения, вы можете использовать флаг "g" и выполнить цикл, вызывая exec() несколько раз, например:

var abc = "test/abcd{string1}test{string2}test"; //any string
var regex = /{(.+?)}/g;
var match, results = [];
while (match = regex.exec(abc)) {
    results.push(match[1]);   // save first captured parens sub-match into results array
}

// results == ["string1", "string2"]

Вы можете увидеть, как это работает здесь: http://jsfiddle.net/jfriend00/sapfm/

...