解析正则表达式

本文关键字:正则表达式 | 更新日期: 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(就像我说的,你需要考虑如何定义"单词"。
  • 等。