Как вы получаете доступ к соответствующим группам в регулярном выражении JavaScript? - PullRequest
1192 голосов
/ 11 января 2009

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

var myString = "something format_abc"; // I want "abc"

var arr = /(?:^|\s)format_(.*?)(?:\s|$)/.exec(myString);

console.log(arr);     // Prints: [" format_abc", "abc"] .. so far so good.
console.log(arr[1]);  // Prints: undefined  (???)
console.log(arr[0]);  // Prints: format_undefined (!!!)

Что я делаю не так?


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

"date format_%A"

Сообщение о том, что «% A» не определено, кажется очень странным поведением, но оно не имеет прямого отношения к этому вопросу, поэтому я открыл новый, Почему совпадающая подстрока возвращает «undefined» "в JavaScript? .


Проблема заключалась в том, что console.log принимает свои параметры как оператор printf, и поскольку строка, которую я записывал ("%A"), имела специальное значение, она пыталась найти значение следующего параметра.

Ответы [ 16 ]

6 голосов
/ 11 января 2009

Используя ваш код:

console.log(arr[1]);  // prints: abc
console.log(arr[0]);  // prints:  format_abc

Редактировать: Safari 3, если это имеет значение.

5 голосов
/ 25 ноября 2016

function getMatches(string, regex, index) {
  index || (index = 1); // default to the first capturing group
  var matches = [];
  var match;
  while (match = regex.exec(string)) {
    matches.push(match[index]);
  }
  return matches;
}


// Example :
var myString = 'Rs.200 is Debited to A/c ...2031 on 02-12-14 20:05:49 (Clear Bal Rs.66248.77) AT ATM. TollFree 1800223344 18001024455 (6am-10pm)';
var myRegEx = /clear bal.+?(\d+\.?\d{2})/gi;

// Get an array containing the first capturing group for every match
var matches = getMatches(myString, myRegEx, 1);

// Log results
document.write(matches.length + ' matches found: ' + JSON.stringify(matches))
console.log(matches);

function getMatches(string, regex, index) {
  index || (index = 1); // default to the first capturing group
  var matches = [];
  var match;
  while (match = regex.exec(string)) {
    matches.push(match[index]);
  }
  return matches;
}


// Example :
var myString = 'something format_abc something format_def something format_ghi';
var myRegEx = /(?:^|\s)format_(.*?)(?:\s|$)/g;

// Get an array containing the first capturing group for every match
var matches = getMatches(myString, myRegEx, 1);

// Log results
document.write(matches.length + ' matches found: ' + JSON.stringify(matches))
console.log(matches);
2 голосов
/ 11 февраля 2019

С es2018 теперь вы можете String.match() с именованными группами, что делает ваше регулярное выражение более явным из того, что он пытался сделать.

const url =
  '/330216/kak-vy-poluchaete-dostup-k-sootvetstvuyschim-gruppam-v-regulyarnom-vyrazhenii-javascript';
const regex = /(?<protocol>https?):\/\/(?<hostname>[\w-\.]*)\/(?<pathname>[\w-\./]+)\??(?<querystring>.*?)?$/;
const { groups: segments } = url.match(regex);
console.log(segments);

и вы получите что-то вроде

{protocol: "https", имя хоста: "stackoverflow.com", pathname: "questions / 432493 / how-do-you-you-access-the-matched-groups-in-a-javascript-регулярное выражение", строка запроса: "some = parameter"}

2 голосов
/ 11 января 2009

Ваш код работает для меня (FF3 на Mac), даже если я согласен с PhiLo , что регулярное выражение должно быть:

/\bformat_(.*?)\b/

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

1 голос
/ 16 февраля 2019

Вам не нужен явный цикл для анализа нескольких совпадений - передайте функцию замены в качестве второго аргумента, как описано в: String.prototype.replace(regex, func):

var str = "Our chief weapon is {1}, {0} and {2}!"; 
var params= ['surprise', 'fear', 'ruthless efficiency'];
var patt = /{([^}]+)}/g;

str=str.replace(patt, function(m0, m1, position){return params[parseInt(m1)];});

document.write(str);

Аргумент m0 представляет полную совпавшую подстроку {0}, {1} и т. Д. m1 представляет первую подходящую группу, т.е. часть, заключенную в скобки в регулярном выражении, которая равна 0 для первого совпадения , И position - это начальный индекс в строке, где была найдена соответствующая группа - в этом случае не используется.

1 голос
/ 27 июня 2015
/*Regex function for extracting object from "window.location.search" string.
 */

var search = "?a=3&b=4&c=7"; // Example search string

var getSearchObj = function (searchString) {

    var match, key, value, obj = {};
    var pattern = /(\w+)=(\w+)/g;
    var search = searchString.substr(1); // Remove '?'

    while (match = pattern.exec(search)) {
        obj[match[0].split('=')[0]] = match[0].split('=')[1];
    }

    return obj;

};

console.log(getSearchObj(search));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...