1

一重引用符または二重引用符の後に、一致した文字以外の任意の数の文字が続き、その後に一致した文字の 1 つが続きます。

"--'__'--"

両端の二重引用符で一致する必要があります。ただし、既にテストされた文字は将来の一致に含めるべきではないという点で、一致を所有格にしたいと考えています。

"--'__'--

最初の二重引用符の後に別の二重引用符が続くことはないため、一致しないはずです。私は思いついた:

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

しかし、これは真ん中の一重引用符によって上記の 2 番目の文字列の例と一致します。アトミックグループがこれを達成しない理由がわかりません。アトミックグループ化の他の配置でもこれを達成できませんでした。

また、引用符が存在することを主張しながら、引用符の間にある文字のみを一致させることがまったく可能であれば、それは素晴らしいことです. 後読みアサーションは固定幅であるため、後方参照を使用して、一重引用符または二重引用符のキャプチャされたグループが否定先読みの前に発生することをアサートすることはできません。

4

1 に答える 1

0

1行に有効な引用符で囲まれた部分文字列が1つしかない場合、これは適切な開始点になる可能性があります。

<?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つの有効な引用符付き部分文字列を含む各行に一致し、無効な(つまり"--'__'--、不均衡な二重引用符付き部分文字列がある)または引用符付き部分文字列がない行をスキップします。一致する行の場合、有効な引用符で囲まれた部分文字列の内容がグループに返され$1ます。この関数は、一致した部分文字列の配列を返します。

データに1行に複数の部分文字列が含まれる場合、または引用符で囲まれた部分文字列または引用符で囲まれた部分文字列の間にエスケープされた引用符が含まれる場合は、より複雑なソリューションが定式化される可能性があります。

于 2012-01-05T01:38:21.663 に答える