【问题标题】:Parsing a regex解析正则表达式
【发布时间】:2011-05-11 18:14:11
【问题描述】:

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

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

【问题讨论】:

  • word 是任何不带空格的字母数字字符串。
  • @Prabhu:是的,但是是niñoéléphantMarie-Hélène 的话?
  • 是一个字母数字字符串,表示其中只包含\p{Alphabetic} 和/或\p{Number} 代码点?还是您想强加一些更受限制的含义?
  • @M42,一个词可以是:@"^([A-Za-z0-9])*"
  • 如果是单词,则不能使用\w。您必须使用真正的 \p{Alphabetic} 属性和附加规定。

标签: c# .net asp.net regex


【解决方案1】:

类似的东西

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 => 狗)

【讨论】:

  • C♯ 中的\w 是否满足The Unicode Standard’s requirement\w 必须完全匹配 [\p{Alphabetic}\p{Decimal_Number}\p{Mark}\p{Connector_Punctuation}]?如果是这样,它会比原始请求更多和更少匹配。如果不匹配,那么它的匹配肯定远低于指定的原始请求。
  • \w 匹配 ` [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}], whilst (natch!) \W ` 匹配它的否定,\b(单词边界)匹配零宽度(^|$|\W)。
  • 匹配项:小写、大写、大写、其他、修饰符、数字/十进制数字、标点连接符(如_Word Character: \w - MSDN
  • @Nicholas:所以他们仍然没有让它符合 Unicode 规定的要求。这太糟糕了。它缺少\p{Other_Alphabetic} 字符,其中包括各种\p{GC=Mark}\p{GC=Letter_Number}\p{GC=Symbol} 代码点。检查规格。
  • @tchrist:随便。这似乎是一个按下按钮的问题 (google.com/…)。享受吧。
【解决方案2】:

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

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

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

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

【讨论】:

  • 我不相信存在 any\w 定义映射到字母数字字符串。一些正则表达式库仍然过时 20 年的愚蠢和无用的旧 ASCII 定义,也没有 The Unicode Standard 所需的当前版本完全映射到 [\p{Alphabetic}\p{Number}]
  • @tchrist 我发帖时他没有指定字母数字。
  • @tchrist 测试人员确实是这样映射的。
  • 啊,我明白了。那是有道理的。英语通常远不如我们的正则表达式要求精确。
  • 是否以这种方式映射它并不重要。重要的是它是否符合The Unicode Standard。看来它不是一个合格的应用程序。
【解决方案3】:

根据您对“单词”的定义(\w 更像是标识符或关键字中有效符号的 C 语言定义:[a-z0-9_]。),您可以尝试以下方法——我正在定义“单词” " 这里是一系列非空白字符:

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

以上已测试here,匹配如下:

  • 匹配字符串开头或空白字符,后跟
  • 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(就像我说的,你需要考虑如何定义“单词”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 2011-03-20
    • 2012-07-08
    • 2010-10-23
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多