正则表达式-匹配有效的公司名称(英国法规)

时间:2018-09-09 11:10:24

标签: regex

我正在尝试构建一个正则表达式,以匹配基于The Company Regulations 2015 - Permitted characters的英国有效的公司命名标准。我要匹配的模式:

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

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

  2. 可以使用每个组一种类型的符号:*

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

  3. 允许的符号仅在前三个字符之后

    * = # % +

  4. 最多允许160个字符。

*要进一步详细说明第2部分:

  

(d)column 1 of table 2 in Schedule 1中提及的任何其他标点符号,但只能采用该表格第2列中与该标点符号相反的一种格式。

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


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

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

此正则表达式将无法匹配第2部分:每组规则一种类型测试用例。

我可以不使用正则表达式来解决此问题,但是我有兴趣知道是否仅可以使用正则表达式吗?

1 个答案:

答案 0 :(得分:1)

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

Regex101并进行进一步测试:

说明:

Positive lookaheads用于声明字符串,该字符串遵循标准的(d)部分(表示可以使用每组一种类型的符号)。在其中,每个子规则之间都用atomic grouping隔开,以提高性能。

PCRE

/^
  (?=
    (?>  [^{}()<>]*   \[+  [^{}()<>]*   \]+  [^{}()<>]*   )  *$|
    (?>  [^[\]()<>]*  \{+  [^[\]()<>]*  \}+  [^[\]()<>]*  )  *$|
    (?>  [^[\]{}<>]*  \(+  [^[\]{}<>]*  \)+  [^[\]{}<>]*  )  *$|
    (?>  [^[\]{}()]*  \<+  [^[\]{}()]*  \>+  [^[\]{}()]*  )  *$|
    (?>  [^[\]{}()<>]*                                    )  *$
  )

  (?=
    (?>  [^"]*   \“+  [^"]*   \”+  [^"]*   )  *$|
    (?>  [^“”]*  \"+  [^“”]*  \"+  [^“”]*  )  *$|
    (?>  [^"“”]*                           )  *$
  )

  (?=
    (?>  [^']*   ‘+  [^']*  ’+  [^']*   )  *$|
    (?>  [^‘’]*  '+  [^‘’]* '+  [^‘’]*  )  *$|
    (?>  [^'‘’]*                        )  *$
  )

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

JavaScript和Python

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}
$/

希望这对其他人有用。