解析正则表达式

时间:2011-05-11 18:14:12

标签: c# .net asp.net regex

我在C#中编写正则表达式时遇到问题;它的目的是从给定的字符串中提取以“@”开头的所有单词,以便它们可以存储在某种类型的数据结构中。

如果字符串是“快速@brown fox跳过懒惰的@dog”,我想得到一个包含两个元素的数组:brown和dog。它需要正确处理边缘情况。例如,如果它是@@ brown,它仍然应该产生'brown'而不是'@brown'。

3 个答案:

答案 0 :(得分:3)

@[\w\d]+应该适合你。

使用http://www.regextester.com/进行测试。

这适用于匹配@,后跟一个或多个单词字符。 \w代表任何“字词”(character sets)\d代表任意数字,+ (repetition)代表一个或多个。 \w\d都可以用括号括起来。

要排除@您可以使用str.Substring(1)忽略第一个字符,或使用正则表达式@([\w\d]+)并提取第一个字符组。

答案 1 :(得分:3)

类似这样的事情

C#:

string quick = "The quick @brown fox jumps over the lazy @dog @@dog";
MatchCollection results = Regex.Matches(quick, "@\\w+");

foreach (Match m in results)
{
    Literal1.Text += m.Value.Replace("@", "");
}

也照顾你的边缘情况。 (@@ dog => dog)

答案 2 :(得分:0)

根据您对“单词”的定义(\w更多是在标识符或关键字中有效的符号的C语言定义:[a-z0-9_]。),您可以尝试下面的内容 - 我m在这里将“word”定义为非空白字符序列:

(^|\s)(@+(?<atword>[^\s]+))(\s|$)

以上内容已经过测试here,并且符合以下条件:

  • 匹配字符串开头或空格字符,然后是
  • 一个或多个@个字符,后跟
  • 一个或多个非空白字符,名为“atword”的组,后跟
  • 一个空格字符或字符串结尾。

对于成功匹配,命名组atword将包含引入@符号后面的文字。

所以:

  • This @@ foo将无法匹配。
  • This @foo bar将匹配
  • `@@@ foobarbat是一种愚蠢的匹配
  • `@@@ foobar @ bazabat将匹配。
  • silly.@rabbit, tricks are for kids不匹配,但
  • silly @rabbit, tricks are for kids将匹配,您将获得rabbit,而不是rabbit(就像我说的,您需要考虑如何定义'word'。