регулярное выражение обратная ссылка отрицательный взгляд атомная группа - PullRequest
1 голос
/ 04 января 2012

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

"--'__'--"

Должно совпадать с двойнойцитаты на каждом конце.Тем не менее, я хочу, чтобы совпадение было притяжательным, так как любые символы, которые уже были проверены, не должны быть включены ни в какие будущие совпадения:

"--'__'--

Если не , потому что двойная кавычканачало никогда не сопровождается другим в конце.Я придумал:

(?P<q>['"])(?>((?!(?P=q)).)*)(?P=q)

Но это все равно соответствует моему второму приведенному выше примеру строки с одинарными кавычками в середине.Я не понимаю, почему атомная группа не достигает этого.Я не смог выполнить это ни с какой другой организацией атомной группировки.

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

1 Ответ

0 голосов
/ 05 января 2012

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

<?php // test.php Rev:20120105_1800
// Return array of valid quoted substrings, one per line.
function getArrayOfOnePerLineValidQuotedSubstrings($text) {
    $re = '%
        # Match line w/1 valid "single" or "double" substring.
        ^               # Anchor to start of line.
        [^\'"]*         # Everything up to first quote.
        (?|             # Branch reset group $1: Contents.
          "([^"]*)"     # Either $1.1 Double quoted,
        | \'([^\']*)\'  # or $1.2 Single quoted contents.
        )               # End $1: branch reset group.
        [^\'"]*         # Everything after quoted sub-string.
        $               # Anchor to end of line.
        %xm';
    if (preg_match_all($re, $text, $matches)) {
        return $matches[1];
    }
    return array();
}
// Fetch test data from file.
$data = file_get_contents('testdata.txt');
// Get array of valid quoted substrings, one per line.
$output = getArrayOfOnePerLineValidQuotedSubstrings($data);
// Display results.
$count = count($output);
printf("%d matches found.\n", $count);
for ($i = 0; $i < $count; ++$i) {
    printf("  match[%d] = {%s}\n", $i + 1, $output[$i]);
}
?>

Это регулярное выражение соответствует каждой строке, содержащей одну действительную подстроку в кавычках, и пропускает строки, которые имеют недопустимые значения.(то есть "--'__'--, который имеет несбалансированную подстроку в двойных кавычках) или нет подстрок в кавычках.Для совпадающих строк содержимое допустимой подстроки в кавычках возвращается в группу $1.Функция возвращает массив совпавших подстрок.

Если ваши данные будут содержать более одной подстроки в строке или если заключенные в кавычки подстроки или вещи между заключенными в подстроки могут содержать экранированные кавычки, то более сложное решение может бытьсформулировали.

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