【问题标题】:Regex to include strings that start with @ but not in the middle of string?正则表达式包含以 @ 开头但不在字符串中间的字符串?
【发布时间】:2013-03-14 04:05:54
【问题描述】:

我正在尝试匹配类似于 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+) 只需检查它前面的空格。

标签: php regex


【解决方案1】:

我建议使用否定的lookbehind,例如:

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

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

【讨论】:

  • 太棒了,出于某种原因,我没有想到负面的回顾。虽然为了保持他目前拥有的子集匹配,我建议(?&lt;!\S)(@)(\S+)
  • Qtax,不确定你是否还在看这个帖子,但首先非常感谢 99% 的工作答案。发现了一个奇怪的情况,它不能尽其所能。如果字符串是 @username
    那么它也匹配
  • @Mark,尝试使用[^\s&lt;&gt;] 代替\S,例如:(?&lt;![^\s&lt;&gt;])@([^\s&lt;&gt;]+)
  • @qtax 是的,完美。希望我能投票更多。再次感谢您的惊人帮助!
【解决方案2】:

作为答案,您不想在文本中间检查@,但它前面需要一个空格,所以使用(\s|^)+([@])(\S+)

【讨论】:

  • (\s|^)+([@])(\S+) 将匹配前面的空格,或者如果该行以 @ 开头
  • 所以它必须在字符串的开头?当然,这可以通过^([@])(\S+) ^^ 完成
  • (\s|^)+([@])(\S+) 按照要求完美匹配,问题是通过包含空格,我在其上运行 preg_replace 并且它现在添加我的替换而不句子中的空格。想知道正则表达式中是否有可能的修复,而无需手动添加空格。原来的 ([@])(\S+) 只匹配单词,没有空格,所以它不会破坏句子结构
  • 你可以使用它的引用,比如$1&lt;mylink, etc&gt;$3? (在替换部分)
  • @Mark(如果不将其设为子集,我们就不能断言开头或空格,并且子集只会匹配最后一个字符,因此我们需要在替换中引用它为了匹配一个或另一个。)如果没有,您可以使用两个preg_replace 语句,一个与^([@])(\S+),另一个与\s([@])(\S+),以匹配内联和起始的。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    ^@.* 上面的正则表达式匹配你要找的内容

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多