Несколько захватов с одним набором паренов в большем регулярном выражении - PullRequest
1 голос
/ 25 марта 2009

У меня есть регулярное выражение (javascript), что-то вроде ...

/ (х) (у) + (г) / г

Проблема в том, что я всегда получу ровно 3 захвата от этих паренов, даже если (y) + совпадало несколько раз. Если он совпадает несколько раз, он просто возвращает последнее совпадение. У меня нет возможности заранее узнать, сколько раз y будет совпадать на каждом конкретном прогоне, но я хочу захватить все из них.

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 25 марта 2009

Я бы использовал

/(x)(y+)(z)/gi

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

3 голосов
/ 25 марта 2009

Я так понимаю, вы не можете использовать

/(x)((?:y)+)(z)/gi

потому что это часть "большего регулярного выражения"?

2 голосов
/ 25 марта 2009

Переместите + внутри скобок, а затем разбейте y на отдельные части. Ниже приведен Perl, но он должен дать вам представление:

#!/usr/bin/perl

use strict;
use warnings;

my $s = "abcbcbcd";

my ($x, $y, $z) = $s =~ /(a)((?:bc)+)(d)/;

my @y = $y =~ /(bc)/g;

print "x is $x\n",
    "y is ", join(", ", @y), "\n",
    "z is $z\n";

А вот какой-то дерьмовый Javascript, который я взломал вместе (я действительно не знаю Javascript):

<html>
<body>

<script type="text/javascript">
var str = "abcbcbcd"; 
var matches = str.match(/(a)((?:bc)+)(d)/);
var x = matches[1];
var y = matches[2].match(/(bc)/g);
var z = matches[3];

document.write(
    "x is ", x, "<br />",
    "y is ", y.join(", "), "<br />",
    "z is ", z
);
</script>

</body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...