RegEx, чтобы соответствовать вещи между скобками - PullRequest
40 голосов
/ 02 июня 2011

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

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

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

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

Регулярное выражение I 'm использует /\((.+)\)/, что, кажется, соответствует правильному , если есть только один набор скобок.

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

Ответы [ 4 ]

92 голосов
/ 02 июня 2011

Вам нужно сделать свой шаблон регулярных выражений «нежадным», добавив «?»после '. +'

По умолчанию '*' и '+' являются жадными в том смысле, что они будут соответствовать максимально возможной длине строки символов, игнорируя любые совпадения, которые могут встречаться в строке.

Нежадность заставляет шаблон соответствовать только самому короткому совпадению.

См. Остерегайтесь жадности! для лучшего объяснения.

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

\(([^\)]+)\)

, которое будет соответствовать любой группе паренов, которые сами по себе не содержат паренов.

6 голосов
/ 02 июня 2011

Используйте это выражение:

/\(([^()]+)\)/g

например:

function()
{
    var mts = "something/([0-9])/([a-z])".match(/\(([^()]+)\)/g );
    alert(mts[0]);
    alert(mts[1]);
}
4 голосов
/ 02 июня 2011

Если s ваша строка:

s.replace(/^[^(]*\(/, "") // trim everything before first parenthesis
 .replace(/\)[^(]*$/, "") // trim everything after last parenthesis
 .split(/\)[^(]*\(/);      // split between parenthesis
4 голосов
/ 02 июня 2011
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]"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...