2

我有一个简单的正则表达式在字符串中查找 twitter 样式标签,如下所示:

$reg_exUrl = "/@([A-Za-z0-9_]{1,15})/";

这对于匹配 @ 符号后的单词非常有用。

我不希望它做的一件事是匹配句号。

所以它应该匹配

“@foo”

但不应该匹配

“@foo。”

我尝试添加修改表达式以禁止句号,如下所示:

$reg_exUrl = "/@([A-Za-z0-9_]{1,15})[^\.]/";

这几乎可以工作,除非它在字符串的末尾不匹配。例如:

它将匹配此“@foo 此处有更多文字”

但不会匹配这个“@foo”

谁能告诉我哪里出错了?

谢谢

4

3 回答 3

3

首先,您的原始表达式可以写成如下:

/@\w{1,15}/

因为\w等价于 [A-Za-z0-9_]。

其次,您的表达式与名称不匹配,.因此您可能意味着您不想匹配以点结尾的名称,这可以通过以下方式完成:

/@\w{1,15}(?![^\.]*\.)/

或者,如果你想匹配一个名字,不管它不以点结尾,那么

/@\w+(?![^\.]\.)/

哦,我忘了一件事,您的问题是由于缺少任何锚字符(例如行首^和行尾)引起的$,因此如果您想匹配仅包含推特名称的字符串,则应使用它们希望验证。

摘要:如果您想匹配文档中任何位置的名称,请不要使用锚点,如果您想知道给定字符串是否是有效名称,请使用锚点。

于 2013-08-23T12:55:42.147 回答
2

如果它位于字符串的末尾,则它不起作用,因为它正在[^\.]等待它。

您想要什么,您可以使用负前瞻来确保之后没有点,如下所示:

/@([A-Za-z0-9_]{1,15})(?![^\.]*\.)/

在此处输入图像描述

在这里测试


你也可以这样做:

/@([A-Za-z0-9_]{1,15})([^\.]*)$/

在此处输入图像描述

在这里测试

这个允许使用点以外的可选字符,然后它必须是字符串的结尾。

于 2013-08-23T12:53:40.310 回答
1

A$匹配字符串的结尾,并且为了将来参考,a^匹配开头:

$reg_exUrl = "/@([A-Za-z0-9_]{1,15})$/";
于 2013-08-23T12:51:36.533 回答