2015-10-21 89 views
1

我试图匹配任何不以“false1”或“false2”开头的字符串,并以true结尾,但由于某种原因,正则表达式不匹配。我究竟做错了什么?使用正则表达式匹配特定模式

$text = "start true"; 
$regex = "~(?:(^false1|false2).+?) true~"; 
if (preg_match($regex, $text, $match)) { 

echo "true";  

} 

预期结果:

true 

实际结果:

null 
+0

把你的正则表达式扔进:https://regex101.com,看看右边的解释。然后你会看到你的正则表达式真的做了什么。 ('^(?<!false1 | false2)(。*?)true $') – Rizier123

+0

@ Rizier123这是你的评论中的正则表达式的解决方案或...?因为它不正确。 – frosty

+0

@ Rizier123另外,我已经知道该网站,并知道它做了什么,并没有帮助我弄清楚如何解决它。 – frosty

回答

1

您可以使用负前瞻。

^(?!false[12]).*true$ 

如果你真的想使用边界那就试试这个,

^(?!false[12]\b).*\btrue$ 

DEMO

更新:

^(?!.*false[12]\b).*\btrue$ 

(?!.*false[12]\b)排除模式,它断言,该字符串包含任何字符但不是子字符串false1false2,它必须以字符串true结尾,这就是为什么我们最后添加了true$

+0

但是,如果$文本是“start false1 true”,它也是回声。 – frosty

+0

'我试图匹配任何不以“false1”或“false2”开头的字符串。但是上面的不是以false1开始的。 –

+0

我不希望它匹配任何具有false1的字符串,或者接着是true的false2。对不起,如果我不清楚这一点。 – frosty