You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET中匹配以@或#开头单词的正则表达式问题咨询

在.NET中检测以@或#开头的单词的正则表达式

你之前用的^[@#]之所以没达到预期,是因为它只会匹配整个字符串(或多行模式下的整行)的开头是@或#的情况,而不是文本中任意位置的单词开头。

要匹配文本中任何位置、以@或#开头的单词,我们可以利用正则的断言来定位单词的起始位置,结合字符匹配来实现:

推荐正则表达式

根据你的需求,有两种常用的写法:

1. 匹配以@/#开头、后跟单词字符的单词

适用于类似@username、#hashtag123这种标准的标签/用户名格式:

(?<!\S)[@#]\w+

各部分解释:

  • (?<!\S):负向零宽断言,确保@或#的前面是空白字符(或字符串开头),也就是这个符号是一个独立单词的起始位置
  • [@#]:匹配@或#符号
  • \w+:匹配一个或多个单词字符(字母、数字、下划线),如果需要支持中文等非英文单词字符,可以替换为[\w\u4e00-\u9fa5]+

2. 匹配以@/#开头、直到下一个空白前的所有字符

如果需要匹配更灵活的格式(比如@!special-user这种包含特殊符号的情况),可以用:

(?<!\S)[@#]\S+

这里的\S+会匹配所有非空白字符,直到遇到下一个空白为止。

.NET中的使用示例(C#)

下面是一个简单的代码示例,演示如何在C#中使用这个正则来提取所有匹配项:

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string inputText = "欢迎使用@NET开发,这里有#正则表达式的示例,还有@AnotherTest和#Hashtag_中文";
        string regexPattern = @"(?<!\S)[@#]\w+"; // 如果要支持中文,换成@"(?<!\S)[@#][\w\u4e00-\u9fa5]+";

        // 提取所有匹配的结果
        foreach (Match match in Regex.Matches(inputText, regexPattern))
        {
            Console.WriteLine($"找到匹配项: {match.Value}");
        }
    }
}

运行这段代码会输出:

找到匹配项: @NET
找到匹配项: #正则表达式
找到匹配项: @AnotherTest
找到匹配项: #Hashtag_中文

为什么原来的正则不生效?

再强调一下:^[@#]中的^是锚点,默认模式下它只匹配整个字符串的开头。如果你的目标文本中@或#不是在字符串最开始,这个正则自然匹配不到。即使开启多行模式(RegexOptions.Multiline),它也只会匹配每行的开头,而不是任意位置的单词开头。

内容的提问来源于stack exchange,提问作者JokingBear

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:05:44