让我们从简化你所拥有的开始;
开始:
/([;:.,&\s\xc2\-(){}!"'<>]{1})(ALBERTO|A.|A)[\s\xc2-]+(JORGE|J.|J)?[\s\xc2,]+(ALONSO)[\s\xc2*-]+(CALEFACCION)([;:.,&\s\xc2(){}!"'<>]{1})/i
正如我在评论中所说,\b
是“断字”,所以你可以简化很多:
/\b(ALBERTO|A.|A)[\s\xc2-]+(JORGE|J.|J)?[\s\xc2,]+(ALONSO)[\s\xc2*-]+(CALEFACCION)\b/i
(额外的好处:它现在不会匹配任何一方的字符,它将在文本的开头和结尾匹配)
接下来,您可以使用?
点的标记(顺便说一下应该转义;.
很特殊,意思是“匹配任何东西”)
/\b(ALBERTO|A\.?)[\s\xc2-]+(JORGE|J\.?)?[\s\xc2,]+(ALONSO)[\s\xc2*-]+(CALEFACCION)\b/i
最后,要真正回答您的问题,您有两个选择。要么使整个括号名称可选,要么添加一个新的空白选项。第一个是最灵活的,因为我们也需要处理空格:
/\b((ALBERTO|A\.?)[\s\xc2-]+((JORGE|J\.?)[\s\xc2,]+)?)?(ALONSO)[\s\xc2*-]+(CALEFACCION)\b/i
请注意,如果您正在阅读匹配的部分,则需要更新您的索引。另请注意,这解决了省略第二个名称 (JORGE) 仍需要额外空间的问题。
A. J. ALONSO CALEFACCION
这将匹配,A. ALONSO CALEFACCION
和之类的东西ALONSO CALEFACCION
,但不匹配J. ALONSO CALEFACCION
(如果您确实需要,这只是一个小调整)
为了清楚起见,分解最后的字符串:
/\b
(
(ALBERTO|A\.?)[\s\xc2-]+
(
(JORGE|J\.?)[\s\xc2,]+
)?
)?
(ALONSO)[\s\xc2*-]+
(CALEFACCION)
\b/i
最后,这是一个奇怪的想法,但是您可以将可能是首字母的名称更改为以下形式:(A(LBERTO|\.|))
,这意味着您没有重复首字母(可能是错误的来源)