我在C#中编写正则表达式时遇到问题;它的目的是从给定的字符串中提取以“@”开头的所有单词,以便它们可以存储在某种类型的数据结构中。
如果字符串是“快速@brown fox跳过懒惰的@dog”,我想得到一个包含两个元素的数组:brown和dog。它需要正确处理边缘情况。例如,如果它是@@ brown,它仍然应该产生'brown'而不是'@brown'。
答案 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
将包含引入@
符号后面的文字。
所以:
This @@ foo
将无法匹配。This @foo bar
将匹配silly.@rabbit, tricks are for kids
不匹配,但silly @rabbit, tricks are for kids
将匹配,您将获得rabbit,
而不是rabbit
(就像我说的,您需要考虑如何定义'word'。