Подтвердить что ты не робот

RegEx для сопоставления материалов между круглыми скобками

Мне очень трудно заставить это работать. У меня есть строка вроде:

something/([0-9])/([a-z])

И мне нужно регулярное выражение или метод получения каждого совпадения между круглыми скобками и возврат массива совпадений, например:

[
  [0-9],
  [a-z]
]

Я использую регулярное выражение /\((.+)\)/, который, похоже, соответствует правильной , если существует только один набор круглых скобок.

Как я могу получить массив, подобный выше, используя любой метод RegExp в JavaScript? Мне нужно вернуть только этот массив, потому что возвращенные элементы в массиве будут зацикливаться, чтобы создать схему маршрутизации URL.

4b9b3361

Ответ 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