.NET RegEx字母/符号/空格

时间:2016-12-08 11:40:36

标签: c# .net regex

我必须允许所有字母(包括重音符号)= \w

我必须允许space = \s

我必须允许特定符号= [\-\/\.\;\\\,\:\+\(\)]

唯一的限制是这些标志在整个字符串中最多可以出现3次。

目前我有这个正则表达式

^\w*([\-\/\.\;\\\,\:\+\(\)\s]{0,3}\w*){0,2}?$

但是,这限制了一切到某一点。任何人都可以支持我创建正确的正则表达式吗?

1 个答案:

答案 0 :(得分:2)

您似乎不需要\w,只需要\p{L}来匹配字母。请注意,\w[\p{L}\p{N}_]匹配,因此不适合此方案。

将all合并为1个模式 - ^[-\p{L}\s/.;\\,:+()]+$ - 并使用(?!(?:[^-/.;\\,:+()]*[-/.;\\,:+()]){4})负向预测限制它在开始时停止4个非连续出现的这些特殊符号(因此,允许0-3次出现) :

\A(?!(?:[^-/.;\\,:+()]*[-/.;\\,:+()]){4})[-\p{L}\s/.;\\,:+()]+\z

请参阅regex demo

  • \A - 字符串开头
  • (?!(?:[^-/.;\\,:+()]*[-/.;\\,:+()]){4}) - 如果模式符合匹配则会导致匹配失败的负向前瞻:
    • (?:[^-/.;\\,:+()]*[-/.;\\,:+()]){4} - 4个序列:
      • [^-/.;\\,:+()]* - 除了
      • 中定义的字符以外的零个或多个字符
      • [-/.;\\,:+()] - 在集合
      • 中定义了1个字符
  • [-\p{L}\s/.;\\,:+()]+ - 在字符类
  • 中定义的1个或多个字符
  • \z - 字符串的结尾。

使用逐字字符串文字的C#声明:

var pattern = @"\A(?!(?:[^-/.;\\,:+()]*[-/.;\\,:+()]){4})[-\p{L}\s/.;\\,:+()]+\z";

另一种方法:使用非捕获组并对其应用{0,3}限制量词:

\A[\p{L}\s]*(?:[-/.;\\,:+()][\p{L}\s]*){0,3}[\p{L}\s]*\z

another regex demo。请注意,此表达式也会匹配空字符串,以防止它,用[\p{L}\s]*替换第一个或最后一个[\p{L}\s]+

  • [\p{L}\s]* - 匹配0+字母或空白字符
  • (?:[-/.;\\,:+()][\w\s]*){0,3} - 0到3次出现:
    • [-/.;\\,:+()] - 来自集合
    • 的1个字符
    • [\p{L}\s]* - 0+字母或空白字符
  • [\p{L}\s]* - 匹配0+字或空格字符