正则表达式 - 在量化匹配中的任何位置匹配0到1个嵌套字符

时间:2011-03-07 20:38:28

标签: c# .net regex

我需要为程序的某些特定命名属性编写一个正则表达式,但它有一些不寻常的参数。

  • 名称可能包含空格
  • 名称可能包含unicode字符
  • 名称可能包含'(撇号)
  • 名称可能包含 -
  • 名称只能包含一个空格,撇号或连字符。
  • 名称长度可以在3到48个字符之间。

我有以下正则表达式,但它不适用于空格和此类约束。

^(?:[a-zA-Z0-9\p{L}'\-]{3,48})$

我不确定如何嵌套更具体的约束。当我尝试类似的东西时。

^(?:[']?[a-zA-Z0-9\p{L}]{3,48})$

除非撇号是第一个字母,否则它不起作用。我需要它来检查给出的特殊字符是否在字符串中的任何位置,而不是它在正则表达式中以特定顺序出现的位置。我有RegexBuddy并且已经广泛使用它,但它并没有证明在试图解决这个问题上有任何帮助。

3 个答案:

答案 0 :(得分:1)

以下是我的意思:

@"^(?!.*?\s.*?\s|.*?-.*?-|.*?'.*?').{3,48}$"

我不知道这是否完美,但它看起来很接近我。我想弄清楚最后.是否过宽;如果有人想纠正我,我会欢迎它。


编辑:永远不要满足于单独留下,我发现你可以缩短它。

@"^(?!.*?([-'\s]).*?\1).{3,48}$"

可能会奏效,但我不确定foo-bar'baz'qux是否会欺骗它。我不认为这将是一个问题。你可以试一试。

答案 1 :(得分:1)

这个正则表达式应该这样做:

/^(?!(?:.*[ ]){2})(?!(?:.*[']){2})(?!(?:.*[-]){2})(?=[a-zA-Z0-9 \p{L}'-]{3,48}$)/

/
   ^                         # start of string
    (?!(?:.*[ ]){2})         # no greater than 1 space
    (?!(?:.*[']){2})         # no greater than 1 apostrophe
    (?!(?:.*[-]){2})         # no greater than 1 dash
    (?=[a-zA-Z0-9 \p{L}'-]{3,48}$)   # 3 - 48 characters of this class
/x

答案 2 :(得分:0)

^(?=[^']*'?[^']*$)(?=[^-]*-?[^-]*$)(?=[^ ]* ?[^ ]*$)[\p{L} '-]{3,48}$