解析正则表达式
本文关键字:正则表达式 | 更新日期: 2023-09-27 17:56:14
我在用C#编写正则表达式时遇到问题;其目的是从给定的字符串中提取所有以"@"开头的单词,以便它们可以存储在某种类型的数据结构中。
如果字符串是"快速的@brown狐狸跳过懒惰的@dog",我想得到一个包含两个元素的数组:棕色和狗。它需要正确处理边缘情况。 例如,如果它是@@brown,它仍然应该产生"棕色"而不是"@brown"。
像这样
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=>只狗)
@['w'd]+
应该适合你。
使用 http://www.regextester.com/进行测试。
这通过匹配@
,后跟一个或多个单词字符来工作。 'w
表示任何"单词字符"(字符集),'d
表示任何数字,+
(重复)表示一个或多个。 'w
和'd
都允许用括号括起来。
要排除@
您可以使用str.Substring(1)
忽略第一个字符,或者使用正则表达式@(['w'd]+)
并提取第一个组。
根据您对"word"的定义('w
更像是标识符或关键字中有效的符号的 C 语言定义:[a-z0-9_]
.),您可以尝试以下 — 我在这里将"word"定义为一系列非空格字符:
(^|'s)(@+(?<atword>[^'s]+))('s|$)
以上内容已在此处进行了测试,并符合以下条件:
- 匹配字符串开头或空格字符,后跟
- 1 个或多个
@
字符,后跟 - 1 个或多个非空格字符,在名为"atword"的组中,后跟
- 空格字符或字符串结尾。
对于成功的匹配,命名的组atword
将包含导入@
符号后面的文本。
所以:
-
This @@ foo
不匹配。 -
This @foo bar
将匹配 - "@@@foobarbat有点傻会匹配
- "@@@foobar@bazabat会匹配的。
-
silly.@rabbit, tricks are for kids
不匹配,但是 -
silly @rabbit, tricks are for kids
会匹配,你会得到rabbit,
而不是rabbit
(就像我说的,你需要考虑如何定义"单词"。 - 等。