Regex найти все строки, которым предшествует = и заканчивается на &

Мне нужно найти в большом тексте все строки, которые находятся между = и и символами. Я не хочу, чтобы строки результатов содержали = и &, только то, что между ними.

Ответ 1

Если ваш двигатель regex поддерживает lookbehinds/lookaheads:

(?<==).*?(?=&)

В противном случае используйте это:

=(.*?)&

и группы захвата захвата 1.

Если ваш двигатель регулярного выражения не поддерживает нежелательное соответствие, замените .*? на [^&]*.


Но поскольку zzzzBov упоминается в комментарии, если вы разбираете префиксы GET URL, обычно используются более эффективные собственные методы для разбора аргументов GET.

В PHP, например, было бы:

<?php
$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first;  // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz
parse_str($str, $output);
echo $output['first'];  // value
echo $output['arr'][0]; // foo bar
echo $output['arr'][1]; // baz
?>

(Как найдено на php.net.)

Изменить: Появляется, что вы используете Javascript.

Javascript решение для разбора строки запроса в объект:

var queryString = {};
anchor.href.replace(
    new RegExp("([^?=&]+)(=([^&]*))?", "g"),
    function($0, $1, $2, $3) { queryString[$1] = $3; }
);

Источник: http://stevenbenner.com/2010/03/javascript-regex-trick-parse-a-query-string-into-an-object/

Ответ 2

Предполагая, что ваш механизм regex поддерживает lookaheads.

/(?<==).*?(?=&)/

Изменить:

Javascript не поддерживает lookbehind так:

var myregexp = /=(.*?)(?=&)/g;
var match = myregexp.exec(subject);
while (match != null) {
    for (var i = 0; i < match.length; i++) {
        // matched text: match[i]
    }
    match = myregexp.exec(subject);
}

это то, что вы должны использовать.

Объяснение:

"
=       # Match the character "=" literally
(       # Match the regular expression below and capture its match into backreference number 1
   .       # Match any single character that is not a line break character
      *?      # Between zero and unlimited times, as few times as possible, expanding as needed (lazy)
)
(?=     # Assert that the regex below can be matched, starting at this position (positive lookahead)
   &       # Match the character "&" literally
)
"

Ответ 3

/=([^&]*)&/

Конечно, вам нужно будет адаптировать синтаксис и что с ним делать.