总是返回false的正则表达式

7

可能是重复问题:
什么正则表达式永远不匹配?

如何在php中编写一个总是返回false的正则表达式。

我想要这个是因为我想在没有表单规则的情况下显示错误消息...所以我像这样做了。

if($values['result_msg'] == 'ERROR')
                    {
                    $form->registerRule('just_check','regex','/$^/');                       
                    $form->addRule('abc', 'Please enter valid Model Number.','just_check');
                    }

3
我不认为这个问题有实际意义。 - bcosca
+1 因为这是我在 SO 上见过的最荒谬的问题。 - fabrik
1
我曾经问过这个问题(有充分的理由),但是我现在找不到了。(也想不起来为什么) - Pekka
4
我已经用完了关闭投票。这里有一个重复的链接:http://stackoverflow.com/questions/1845078/what-regular-expression-can-never-match - Pekka
2
“我无法想象使用情况”并不意味着“愚蠢的问题”。 - VolkerK
显示剩余3条评论
3个回答

7
我不知道为什么你想这样做,但是以下代码可以实现此操作:
(?!x)x

第一部分 (?!..) 是一个负向预查,其意思是“确保此位置与此预查内容不匹配”,其中内容为 x,最后的 x 表示“匹配 x” —— 因为这两个相反,表达式永远不会匹配。
你可能还想添加起始和结束标记,即:
^(?!x)x$

你可以将x替换为几乎任何东西,只要两个位是等价的。
还有很多其他方法可以实现这一点,基本上你只需要在同一位置匹配两个互斥条件,正则表达式就会无法匹配 - 更多示例请参见Mark的答案

Pradeep,现在有一个解释。虽然没有解释为什么你首先想要这个 - 可能有更好的解决方案。 - Peter Boughton
@pradeep - @Peter 告诉了你它在做什么,你不明白什么? - slugster
Slugster,StackOverflow没有显示初始编辑-帖子有四个修订版本,而不是历史记录当前显示的一个。 - Peter Boughton

6

有很多种方法可以做到这一点:

  • /(?=a)b/

这无法匹配,因为它搜索既是 a 又是 b 的字符。

  • /\Zx\A/

这无法匹配,因为字符串的结尾不能在字符串的开头之前。

  • /x\by/

这无法匹配,因为单词边界不能在字符 xy 之间。


2
@Pekka:在PHP中,$和^之间必须有一个字符,否则它将匹配空字符串,例如$x^ - Mark Byers

0

试一下这个:

$.^

1
如果启用多行点标志,那么这是否不会匹配换行符? - Peter Boughton
@Peter:不要忽略$^的顺序。 - NikiC
Nikic,请注意听我说!如果启用了多行标志,$ 将匹配“行尾”,^将匹配“行首”。如果启用了点全标志,则 . 将匹配换行符。因此,在多行+点全标志的情况下,$.^ 将匹配 x\ny 中的换行符(\n)。 - Peter Boughton
我已经使用Java和CF正则表达式引擎进行了测试,并验证了这种行为 - 我没有PHP设置可用来检查。 - Peter Boughton
1
啊,我没想到可以多行输入!谢谢你的启示,Peter。 - Johnny Saxon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接