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