否定字符组:匹配“abc”,但不匹配“abc”,

时间:2010-12-27 18:38:07

标签: php regex

我需要一个可以否定一个字符组的模式,并且否定否定组中的一个字符

以下模式有效,但我想多做一些

(?:(?!'\,).)+

这里我不想匹配包含',

的字符串

但我真正需要的是在否定小组中整合一个否定 - 就像这样

(?:(?![^\\]'\,).)+

我不想匹配任何转义的引号

匹配:abc',

不匹配:abc\',


argh ..它在输入时发布..

$str = "'abc\',',asdf";
preg_match("/^('(?:(?!',).)+')/", $str, $matches);
echo '<pre>';
print_r($matches);
echo '</pre>';

这应输出abc\',但输出abc\

2 个答案:

答案 0 :(得分:1)

/^(?:(?!\\\\',).)+$/似乎可以做你想要的。请注意,您必须转义单引号''。见http://ideone.com/ypln2

如果您不一定要匹配完整字符串,请删除^$。见http://ideone.com/G67RV

答案 1 :(得分:1)

根据您的上一条评论判断,我认为您正在尝试匹配单引号字符串文字,其中可能包含使用反斜杠转义的单引号。例如,在此字符串中:

'abc\',','xyz'

...您希望匹配'abc\',''xyz'。这很容易:

$source = "'abc\',','xyz'";
print "$source\n\n";
preg_match_all("/'(?:[^'\\\\]++|\\\\.)*+'/", $source, $matches);
print_r($matches);

输出:

'abc\',','xyz'

Array
(
[0] => Array
    (
        [0] => 'abc\','
        [1] => 'xyz'
    )

)

<强> see it on ideone

但是也许你想要匹配逗号分隔列表中的所有项目,这些项目可能引用也可能不引用 - 换句话说,CSV(或非常类似的东西)。如果是这种情况,您应该使用专用的CSV处理工具;那里有很多人。实际上,PHP内置了一个:http://php.net/manual/en/function.fgetcsv.php