【问题标题】:Why can't I match POSIX Character Classes为什么我不能匹配 POSIX 字符类
【发布时间】:2012-03-10 03:36:22
【问题描述】:

下面的 sn-p 打印 False:

Console.WriteLine(Regex.IsMatch("abc", @"[[:alpha:]]"));

但这会打印True:

Console.WriteLine(Regex.IsMatch("abc", @"[a-zA-Z]"));

为什么?它们不应该是等价的吗?

【问题讨论】:

  • 您有任何理由相信.NET 的正则表达式语言支持POSIX 字符类吗?我认为它只支持 Unicode 命名的类别/块。
  • @Gabe——我做了,但只是因为我读错了!我在 SO 上看到的一些标记为 .NET 的问题也得到了 POSIX 字符类的回答。

标签: .net regex posix


【解决方案1】:

.NET 正则表达式不支持 Posix 字符类。但是,它们确实支持 Unicode 组。

这可行:

Regex.IsMatch("abc", @"^\p{L}+$");

\p{L} 组匹配所有 Unicode 字母。

更多信息请看这里:

http://msdn.microsoft.com/en-us/library/20bw873z.aspx#CategoryOrBlock

【讨论】:

  • 请参阅msdn.microsoft.com/en-us/library/… 以获取可接受的类别和块列表。
  • 不幸的是,Unicode 类别L 并不对应所有字母。这就是为什么 Unicode PropList.txt 定义了Other_Alphabetic 属性,它与L 类别和Nl 一起构成了DerivedCoreProperties.txt 中的Alphabetic 属性。应用程序几乎总是需要知道一个字符具有Alphabetic 属性,而不是类别L。不幸的是,直到您的一个使用非拉丁字母语言的用户抱怨,在您部署损坏的应用程序很久之后,您才会注意到差异...... :-(
猜你喜欢
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 2022-01-01
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多