代码之家  ›  专栏  ›  技术社区  ›  u-ways

Regex-匹配有效的公司名称(英国法规)

  •  2
  • u-ways  · 技术社区  · 7 年前

    我试图建立一个正则表达式,以符合英国有效的公司命名标准的基础上 The Company Regulations 2015 - Permitted characters . 我尝试匹配的模式:

    1. 允许的文字字符和符号可用于名称的任何部分:

      A-Z a-z 0-9 ? ! & @ \ / £ $ € ¥ . , «» -

    2. 符号 可用于:*

      " “” - ' ‘’ - () [] {} <>

    3. 只有在 前3个字符:

      * = # % +

    4. 最多允许160个字符。

    *进一步阐述第2部分:

    (d) 中提及的任何其他标点符号 column 1 of table 2 in Schedule 1

    这意味着如果公司名称使用括号 () ,它不应该有方括号 [] {} . 它应该只包括括号。或者如果公司名称使用 “” ,不应使用 " . 同样,如果公司名称使用 ‘’ ,不应使用 '


    Here is my Regex101 with tests 适用于PCRE、JS、Py和Go:

    /^[A-Za-z0-9 \"“”'‘’()[\]{}<>«»\\\/?!&@£$€¥.,-]{3}[*=#%+A-Za-z0-9 \"“”'‘’()[\]{}<>«»\\\/?!&@£$€¥.,-]{0,157}$/
    

    第2部分:每组一种规则 测试用例。

    我可以解决这个问题没有regex,但我有兴趣知道,如果它是可能的,只有在regex?

    1 回复  |  直到 5 年前
        1
  •  1
  •   u-ways    7 年前

    此解决方案基于 @UnbearableLightness 注释中的正则表达式。

    带有进一步测试的Regex101:

    说明:

    Positive lookaheads 第(d)部分 标准的(每组可使用一种类型的符号)。其中,每个子规则由 atomic grouping

    PCRE公司

    /^
      (?=
        (?>  [^{}()<>]*   \[+  [^{}()<>]*   \]+  [^{}()<>]*   )  *$|
        (?>  [^[\]()<>]*  \{+  [^[\]()<>]*  \}+  [^[\]()<>]*  )  *$|
        (?>  [^[\]{}<>]*  \(+  [^[\]{}<>]*  \)+  [^[\]{}<>]*  )  *$|
        (?>  [^[\]{}()]*  \<+  [^[\]{}()]*  \>+  [^[\]{}()]*  )  *$|
        (?>  [^[\]{}()<>]*                                    )  *$
      )
    
      (?=
        (?>  [^"]*   \“+  [^"]*   \”+  [^"]*   )  *$|
        (?>  [^“”]*  \"+  [^“”]*  \"+  [^“”]*  )  *$|
        (?>  [^"“”]*                           )  *$
      )
    
      (?=
        (?>  [^']*   ‘+  [^']*  ’+  [^']*   )  *$|
        (?>  [^‘’]*  '+  [^‘’]* '+  [^‘’]*  )  *$|
        (?>  [^'‘’]*                        )  *$
      )
    
      [A-Za-z0-9 \"“”'‘’()[\]{}<>«»\\\/?!&@£$€¥.,-]{3}
      [A-Za-z0-9 \"“”'‘’()[\]{}<>«»\\\/?!&@£$€¥.,\-*=#%+]{0,157}
    $/
    

    JavaScript和Python

    lookahead assertion hack to emulate atomic groups

    /^
      (?=
        (?=(  [^{}()<>]*   \[+  [^{}()<>]*   \]+  [^{}()<>]*   ))\1  *$|
        (?=(  [^[\]()<>]*  \{+  [^[\]()<>]*  \}+  [^[\]()<>]*  ))\2  *$|
        (?=(  [^[\]{}<>]*  \(+  [^[\]{}<>]*  \)+  [^[\]{}<>]*  ))\3  *$|
        (?=(  [^[\]{}()]*  \<+  [^[\]{}()]*  \>+  [^[\]{}()]*  ))\4  *$|
        (?=(  [^[\]{}()<>]*                                    ))\5  *$
      )
    
      (?=
        (?=(  [^\"]*  \“+  [^\"]*  \”+  [^\"]*  ))\6  *$|
        (?=(  [^“”]*  \"+  [^“”]*  \"+  [^“”]*  ))\7  *$|
        (?=(  [^\"“”]*                          ))\8  *$
      )
    
      (?=
        (?=(  [^']*   ‘+  [^']*  ’+  [^']*   ))\9   *$|
        (?=(  [^‘’]*  '+  [^‘’]* '+  [^‘’]*  ))\10  *$|
        (?=(  [^'‘’]*                        ))\11  *$
      )
    
      [A-Za-z0-9 \"“”'‘’()[\]{}<>«»\\\/?!&@£$€¥.,-]{3}
      [A-Za-z0-9 \"“”'‘’()[\]{}<>«»\\\/?!&@£$€¥.,\-*=#%+]{0,157}
    $/
    

    希望这对其他人有用。