[英]regex back reference negative lookahead atomic group
我想匹配一個單引號或一個雙引號,然后匹配不匹配該字符的任意數量的字符,然后匹配一個匹配的字符:
"--'__'--"
應在兩端用雙引號匹配。 但是,我希望該比賽具有占有欲,因為任何經過測試的字符都不應包含在以后的任何比賽中:
"--'__'--
如果不匹配,因為在開始的雙引號從不接着又一個結尾。 我想出了:
(?P<q>['"])(?>((?!(?P=q)).)*)(?P=q)
但這仍然與我上面的第二個字符串示例(中間的單引號)匹配。 我不明白為什么原子團不能做到這一點。 我也無法通過原子分組的任何其他安排來實現此目的。
同樣,如果在斷言存在引號的情況下根本只匹配引號之間的字符,那將是極好的。 因為后向斷言是固定寬度的,所以我不能使用反向引用來斷言所捕獲的單引號或雙引號組發生在否定前瞻之前。
假設每行只有一個有效的帶引號的子字符串,這可能是一個很好的起點:
<?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
中返回。該函數返回匹配的子字符串的數組。
如果您的數據每行包含一個以上的子字符串,或者如果引號的子字符串或引號的子字符串之間的內容可能包含轉義的引號,則可以制定更復雜的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.