用于匹配三个特定字符的正则表达式

时间:2013-12-17 11:03:42

标签: php regex

在SO中尝试问题时,我尝试编写正则表达式,该表达式匹配字符串中应该包含的三个字符。

我正在回答Regular Expressions: Is there an AND operator?

<?php

$words = "systematic,gear,synthesis,mysterious";
$words=explode(",",$words);

$your_array = preg_grep("/^(^s|^m|^e)/", $words);

print_r($your_array);

?>

输出应该是系统神秘。但我也会得到合成。

为什么是这样的?我做错了什么?

**我不想要一个新的解决方案:) SEE HERE

1 个答案:

答案 0 :(得分:4)

你可以这样做:

$wordlist = 'systematic,gear,synthesis,mysterious';
$words = explode(',', $wordlist);

foreach($words as $word) {
    if (preg_match('~(?=[^s]*s)(?=[^m]*m)(?=[^e]*e)~', $word))
        echo '<br/>' . $word;
}
//or
$res = preg_grep('~(?=[^s]*s)(?=[^m]*m)(?=[^e]*e)~', $words);
print_r($res);

为了测试字符串中是否存在字符,我使用(?=[^s]*s) [^s]*s表示所有不是“s”零次或多次,以及“s”。  (?=..)是一个先行断言,意思是“后跟”。它只是一个检查,前瞻不会在匹配结果中给出任何字符,但是这个功能的主要好处是你可以多次检查相同的子字符串。

你的模式出了什么问题?

/^(^s|^m|^e)/只会为您提供以“s”或“m”或“e”开头的单词,因为^是一个锚,意思是:“字符串的开头”。换句话说,您的模式与/^([sme])/相同。