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

ve7v8dk2  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(143)

我正在尝试构建一个正则表达式,以匹配基于The Company Regulations 2015 - Permitted characters的英国有效公司命名标准。我尝试匹配的模式:
1.允许的单词字符和符号可用于名称的任何部分:
A-Z a-z 0-9 ? ! & @ \ / £ $ € ¥ . , «» -
1.可以使用每组一种的符号:*
" “” - ' ‘’ - () [] {} <>
1.允许的符号仅在前3个字符之后:
* = # % +
1.最多允许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部分:每组规则一种类型 * 测试用例。
我可以解决这个没有正则表达式,但我有兴趣知道,如果它是可能的,在正则表达式只?

iklwldmw

iklwldmw1#

这个解决方案基于评论中的@Paolo正则表达式。

Regex 101,进一步测试:

Positive lookaheads用于Assert字符串遵循标准的part(d)(每组可以使用一种类型的符号)。并且在内部,每个子规则由atomic grouping分隔以提高性能。

PCRE

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

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

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

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

JavaScript和Python

JavaScript和Python不支持原子分组语法,所以在此之前,你必须先解决一个前瞻Assert(lookahead assertion)的问题,来模拟工作得很好的原子组:

/^
  (?=
    (?=(  [^{}()<>]*   \[+  [^{}()<>]*   \]+  [^{}()<>]*   ))\1  *$|
    (?=(  [^[\]()<>]*  \{+  [^[\]()<>]*  \}+  [^[\]()<>]*  ))\2  *$|
    (?=(  [^[\]{}<>]*  \(+  [^[\]{}<>]*  \)+  [^[\]{}<>]*  ))\3  *$|
    (?=(  [^[\]{}()]*  \<+  [^[\]{}()]*  \>+  [^[\]{}()]*  ))\4  *$|
    (?=(  [^[\]{}()<>]*                                    ))\5  *$
  )

  (?=
    (?=(  [^\"]*  \“+  [^\"]*  \”+  [^\"]*  ))\6  *$|
    (?=(  [^“”]*  \"+  [^“”]*  \"+  [^“”]*  ))\7  *$|
    (?=(  [^\"“”]*                          ))\8  *$
  )

  (?=
    (?=(  [^']*   ‘+  [^']*  ’+  [^']*   ))\9   *$|
    (?=(  [^‘’]*  '+  [^‘’]* '+  [^‘’]*  ))\10  *$|
    (?=(  [^'‘’]*                        ))\11  *$
  )

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

希望这对其他人有用。

相关问题