我必须允许所有字母(包括重音符号)= \w
我必须允许space = \s
我必须允许特定符号= [\-\/\.\;\\\,\:\+\(\)]
唯一的限制是这些标志在整个字符串中最多可以出现3次。
目前我有这个正则表达式
^\w*([\-\/\.\;\\\,\:\+\(\)\s]{0,3}\w*){0,2}?$
但是,这限制了一切到某一点。任何人都可以支持我创建正确的正则表达式吗?
答案 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个序列:
[^-/.;\\,:+()]*
- 除了[-/.;\\,:+()]
- 在集合[-\p{L}\s/.;\\,:+()]+
- 在字符类\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次出现:
[-/.;\\,:+()]
- 来自集合[\p{L}\s]*
- 0+字母或空白字符[\p{L}\s]*
- 匹配0+字或空格字符