RegEx для сопоставления материалов между круглыми скобками
Мне очень трудно заставить это работать. У меня есть строка вроде:
something/([0-9])/([a-z])
И мне нужно регулярное выражение или метод получения каждого совпадения между круглыми скобками и возврат массива совпадений, например:
[
[0-9],
[a-z]
]
Я использую регулярное выражение /\((.+)\)/
, который, похоже, соответствует правильной , если существует только один набор круглых скобок.
Как я могу получить массив, подобный выше, используя любой метод RegExp в JavaScript? Мне нужно вернуть только этот массив, потому что возвращенные элементы в массиве будут зацикливаться, чтобы создать схему маршрутизации URL.
Ответы
Ответ 1
Вам нужно сделать шаблон регулярного выражения "неживым", добавив '?' после ". +"
По умолчанию "*" и "+" являются жадными, поскольку они будут содержать как можно больше строк символов, игнорируя любые совпадения, которые могут возникать в строке.
Нежелательный позволяет шаблону соответствовать кратчайшему возможному совпадению.
Смотрите Остерегайтесь жадности! для лучшего объяснения.
Или поочередно измените ваше регулярное выражение на
\(([^\)]+)\)
который будет соответствовать любой группировке парнеров, которые сами не содержат парсеры.
Ответ 2
Используйте это выражение:
/\(([^()]+)\)/g
например:
function()
{
var mts = "something/([0-9])/([a-z])".match(/\(([^()]+)\)/g );
alert(mts[0]);
alert(mts[1]);
}
Ответ 3
var getMatchingGroups = function(s) {
var r=/\((.*?)\)/g, a=[], m;
while (m = r.exec(s)) {
a.push(m[1]);
}
return a;
};
getMatchingGroups("something/([0-9])/([a-z])"); // => ["[0-9]", "[a-z]"]
Ответ 4
Если s - ваша строка:
s.replace(/^[^(]*\(/, "") // trim everything before first parenthesis
.replace(/\)[^(]*$/, "") // trim everything after last parenthesis
.split(/\)[^(]*\(/); // split between parenthesis