【问题标题】:Regex to match word beginning with @正则表达式匹配以@开头的单词
【发布时间】:2013-11-29 09:34:20
【问题描述】:

我正在尝试开发一些正则表达式来查找所有以@开头的单词:

我认为\@\w+ 会这样做,但这也匹配其中包含@ 的单词

例如 @help me@ ple@se @now

匹配Index: 0 Length 5, Index: 13 Length 3, Index: 17 Length 4

这不应该在索引 13 处匹配吗?

【问题讨论】:

    标签: c# .net regex vb.net


    【解决方案1】:

    使用\B@\w+(非单词边界)。

    例如:

    string pattern = @"\B@\w+";
    foreach (var match in Regex.Matches(@"@help me@ ple@se @now", pattern))
        Console.WriteLine(match);
    

    输出:

    @help
    @now
    

    顺便说一句,你不需要转义@。

    http://ideone.com/nsT015

    【讨论】:

    • 啊,很好的答案+1。消除了后面的样子。
    • 讽刺的是“你不需要转义@”,你的测试字符串之前也不需要@。这没什么区别。 :)
    • 我花了一秒钟才弄清楚非单词边界在这里是如何工作的;打得很好
    【解决方案2】:

    消极的后视怎么样:

    (?<!\w)@\w+
    

    【讨论】:

    • 感谢 Marc,不过他只接了 ple@se
    • @MattWilko 添加了“行首”;p
    • 现在可以使用Index: 0 Length 5, Index: 13 Length 3
    • @MattWilko 第三次幸运?
    • 是的,谢谢 +1,但我会接受 @falsetru 的简单回答
    【解决方案3】:

    那么非正则表达式方法呢?

    C#版本:

    string input = "word1 word2 @word3 ";
    string[] resultWords = input.Split(' ').ToList().Where(x => x.Trim().StartsWith("@")).ToArray();
    

    VB.NET 版本:

    Dim input As String = "word1 word2 @word3 "
    Dim resultWords() As String = input.Split(" "c).ToList().Where(Function(x) x.Trim().StartsWith("@")).ToArray
    

    【讨论】:

      【解决方案4】:

      尝试使用

      (?<=^|\s)@\w+
      

      不记得 c# 是否允许在后面查看时进行交替

      RegExr

      【讨论】:

      • 是的,它确实有效,是的,它有效;消极的后视可能(主观上)更简单,但是:有效
      • 啊 tbf,如果我注意到你的更新答案,我就不会发布了。
      猜你喜欢
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 2010-11-17
      相关资源
      最近更新 更多