【问题标题】:Custom character class in C# regexC# 正则表达式中的自定义字符类
【发布时间】:2014-08-16 15:16:12
【问题描述】:

有没有办法在 C# 正则表达式中定义自定义字符类?

在 flex 中它以非常明显的方式完成:

DIGIT    [0-9]
%%
{DIGIT}+    {printf( "An integer: %s (%d)\n", yytext, atoi( yytext ) );}

http://westes.github.io/flex/manual/Simple-Examples.html#Simple-Examples

正如this answer 中所述,在 PHP 中定义自定义字符类的工作方式如下:

(?(DEFINE)(?<a>[acegikmoqstz@#&]))\g<a>(?:.*\g<a>){2}

有没有办法在c#中实现这个结果,每次使用都不需要重复完整的字符类定义?

【问题讨论】:

  • @Rawling:这是同一种问题,但重点是:如何在 C# 中实现(如果可能)。
  • 我的 reopen vote 的原因:链接副本中的答案根本不涉及 c#,它明确地只处理 Java 和 PHP。那里提出的解决方案不适用于 c# (@Rawling)
  • @HugoRune 好点,我认为这两个答案都只是字符串连接的特定语言版本,但 PHP 正在做一些特别的事情。有一个C# specific question here,我希望您吸引的大多数答案都会遵循相同的思路。
  • @Rawling 是的,我认为也不存在更好的解决方案。但我在谷歌上搜索这个问题,这里的这个问题似乎是唯一适用的结果,所以这里的明确答案应该对未来的访问者有用,即使它是否定的。
  • 有可能使用命名块和类减法来获得相同的效果,或者可能有一个命名块已经匹配所需的字符

标签: c# regex


【解决方案1】:

C# 不支持自定义字符类,但您可以使用named blockscharacter class subtraction 来获得类似的效果。

.NET 定义了 a large number of named blocks 对应于 Unicode 字符类别,如数学或希腊符号。可能有一个块已经符合您的要求。

字符类减法允许您从更广泛的类中的字符中排除一个类或块中的字符。语法是:

[ base_group -[ excluded_group ]]

从链接文档复制的以下示例匹配除空格、希腊字符、标点符号和换行符之外的所有 Unicode 字符:

[\u0000-\uFFFF-[\s\p{P}\p{IsGreek}\x85]]

【讨论】:

    【解决方案2】:

    不,在 C# 中不支持。 This link 将为您提供 .NET Regex 引擎的一个很好的概述。请注意,没有什么能真正阻止您定义变量并使用它们来构造您的正则表达式字符串:

    var digit = "[0-9]";
    var regex = new Regex(digit + "[A-Z]");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      相关资源
      最近更新 更多