Php 正则表达式包含从@开始但不在字符串中间的字符串?

Php 正则表达式包含从@开始但不在字符串中间的字符串?,php,regex,Php,Regex,我正在尝试匹配类似于twitter的@username。我现在使用的正则表达式:“([@])(\S+”在这方面非常有效 然而,限制如下 test@test.com匹配test.com 现在我想完全排除test@test.com 但是,我的一些用户有用户名test@test.com如果他们的电子邮件用户名前面有一个@的话,就要把他们包括在内 所以@test@test.com应该匹配 总结: 需要匹配: @用户名 @试验 @test@test.com 不想匹配: test@test.com正则表达式

我正在尝试匹配类似于twitter的@username。我现在使用的正则表达式:“([@])(\S+”在这方面非常有效

然而,限制如下 test@test.com匹配test.com

现在我想完全排除test@test.com

但是,我的一些用户有用户名test@test.com如果他们的电子邮件用户名前面有一个@的话,就要把他们包括在内

所以@test@test.com应该匹配

总结: 需要匹配:

@用户名

@试验

@test@test.com

不想匹配:


test@test.com

正则表达式看起来像这样:
^@.
将把您锚定到行或字符串的开头。请务必查看,他们的备忘单非常好。

作为答案,您不想检查文本中间的
@
,但它前面需要一个空格,所以请使用
(\s|^)+([@])(\s+
^@*
上面的正则表达式匹配您要查找的内容

我建议使用负查找,例如:

(?<!\S)@(\S+)
(?

这将不会在
@foo
之前包含任何可能的空格,因此您可以毫无问题地替换它。

\s([@])(\s+)
只需检查它前面的空格。
(\s|^)+([@])(\s+)
将匹配前面的空格,或者如果行以
@
开头,那么它必须位于字符串的开头?当然,这可以通过
^([@])(\S+
^^^ the(\S|^)+([@])(\S+)完成正如所问的那样,匹配非常完美,问题是通过包含空格,我对它运行了preg_replace,现在它在句子中添加了我的替换,但没有空格。我想知道在正则表达式中是否有可能在不必手动添加空格的情况下进行修复。原始([@])(\S+)只匹配单词,不匹配空格,因此不会破坏句子结构您可以使用对它的引用,例如
$1$3
?(在替换部分中)@Mark(如果不将其作为子集,我们不能断言开头或空白,并且子集将只匹配最后一个字符,因此我们需要在替换中引用它以匹配其中一个字符。)如果不是,您可以使用两个
preg\u replace
语句,一个带有
^([@])(\S+
,另一个带有
\S([@])(\S+)
以匹配内联的和起始的。太棒了,出于某种原因,我没有想到负面查找。虽然为了保持他当前拥有的子集匹配,我建议
(?Qtax,不确定您是否仍在观看此线程,但首先非常感谢您给出了99%的有效答案。发现了一个奇怪的情况,它没有尽可能好地工作。如果字符串是@username
,那么它与@Mark的一部分匹配,请尝试使用
\S
而不是
[^\S]
,例如:
(?])@([^\S]+)
@qtax是的,太完美了。希望我能投更多的票。再次感谢你的帮助!!